1,使用getopt。getopt()優(yōu)化當(dāng)前的功能函數(shù):
寶山網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
[html]
#!/usr/bin/python
# -*- coding: utf-8 -*-
#coding=utf-8
import os,sys
import getopt
print sys.argv
CDROW='/home/zhouqian/test'
def cdWalker(CDROW,cdfile):
result=[]
for root,dirs,files in os.walk(CDROW):
result.append("%s %s %s" %(root,dirs,files))
print root
open(cdfile,'w').write('\n'.join(result))
def usage():
print '''pycdc 使用方式:
python cdays-3-exercise-1.py -d cdc -k 中國(guó)火
#檢索cdc中有沒(méi)有中國(guó)火字樣的目錄,
'''
try:
opts,args=getopt.getopt(sys.argv[1:],'hd:e:k:')
except getopt.GetoptError:
usage()
sys.exit()
if len(opts)==0:
usage()
sys.exit()
c_path=''
name=''
for opt,arg in opts:
if opt in('-h','--help'):
usage()
sys.exit()
elif opt=='-e':
if os.path.exists(arg):#判斷目標(biāo)路徑是否存在
# cdWalker(CDROW,arg)
print "記錄光盤(pán)的位置是 %s" %arg
else:
print "不存在這樣的目錄"
elif opt=='-d':
c_path=arg
print c_path
cdWalker(CDROW,c_path)
elif opt=='-k':
if not c_path:
usage()
sys.exit()
else:
name=arg
for root,dirs,files in os.walk(c_path):
if root=='%s' %name:
print '您要找的文件在%s' %dirs
這是第一個(gè)題,大概做了2個(gè)小時(shí)吧,各種糾結(jié)啊,后面兩個(gè)正在做。中間遇到的問(wèn)題總結(jié):
函式的利用,os.path.walk,python字符集,getopt模塊的使用學(xué)習(xí),os.path.exists()的利用,列表的對(duì)應(yīng)關(guān)系等等
習(xí)題2 :關(guān)鍵詞-----》序列號(hào)問(wèn)題:
[html]
#!/usr/bin/python
#coding=utf-8
import sys
def collect(file):
result={}
for line in file.readlines():
left,right=line.split()
if result.has_key(right):
result[right].append(left)
else:
result[right]=[left]
return result
if __name__=="__main__":
print sys.argv
if len(sys.argv)==1:
print 'usage:\tpython value_keys.py test.txt'
else:
result=collect(open(sys.argv[1],'r'))
for (right,left) in result.items():
print "%d %s = %s" %(len(left),right,left)
結(jié)果顯示:
[html]
root@zhou:/home/zhouqian/python# py value_keys.py test.txt
ssss
2 key3 = ['6', '33']
3 key2 = ['1', '2', '45']
3 key1 = ['4', '5', '13']
遇到的問(wèn)題總結(jié):
split的用法:line.split()就是分開(kāi)出左右兩邊的值,在默認(rèn)的情況下是以一個(gè)空格或者多個(gè)空格為分割符的,
has_key()的用法:是查看字典數(shù)據(jù)類(lèi)型中有沒(méi)有這么一個(gè)關(guān)鍵字。上面可知result={}是初始化了一個(gè)字典的數(shù)據(jù)類(lèi)型。
字典的一些用法:怎么定義,怎么賦值:result[right]=[left]或者result[right]=left,遍歷字典中所用
項(xiàng),result.items(),遍歷字典的key值:result.keys(),遍歷字典的value值:result.values()
[html]
dict={'chen':25,'zhou':24,'xiao':35}
dict.values()
[25, 35, 24]
dict.keys()
['chen', 'xiao', 'zhou']
dict.items()
[('chen', 25), ('xiao', 35), ('zhou', 24)]
遞歸,emmmmmmm,擁有一種魅力,接近人的立即思維,容易理解,又不容易理解。
遞歸算法的優(yōu)點(diǎn): 它使我們能夠簡(jiǎn)潔地利用重復(fù)結(jié)構(gòu)呈現(xiàn)諸多問(wèn)題。通過(guò)使算法描述以遞歸的方式利用重復(fù)結(jié)構(gòu),我們經(jīng)常可以避開(kāi)復(fù)雜的案例分析和嵌套循環(huán)。這種算法會(huì)得出可讀性更強(qiáng)的算法描述,而且十分有效。
但是 ,遞歸的使用要根據(jù)相應(yīng)的成本來(lái)看,每次遞歸python解釋器都會(huì)給一個(gè)空間來(lái)記錄函數(shù)活動(dòng)狀態(tài)。但是有時(shí)候內(nèi)存成本很高,有時(shí)候?qū)⑦f歸算法轉(zhuǎn)為非遞歸算法是一種好辦法。
當(dāng)然我們可以換解釋器、使用堆棧數(shù)據(jù)結(jié)構(gòu)等方法,來(lái)管理遞歸的自身嵌套,減小儲(chǔ)存的活動(dòng)信息,來(lái)減小內(nèi)存消耗。
最近算法學(xué)到了遞歸這一塊,寫(xiě)了三個(gè)課后習(xí)題:
給一個(gè)序列S,其中包含n個(gè)元素,用遞歸查找其最大值。
輸出:
調(diào)和數(shù):Hn = 1 + 1/2 + 1/3 + ··· + 1/n
輸出:
例如:"12345"class 'str' 轉(zhuǎn)換為12345class 'int'
輸出:
遞歸分為線性遞歸、二路遞歸、多路遞歸。
Print = input("請(qǐng)輸入需要強(qiáng)調(diào)的話:")
Print = Print + "!"
number = int(input("請(qǐng)輸入要重復(fù)的次數(shù):"))
print(Print * number)
1、
10
10
2、
不是
3、
10
10
10
4、
在x=0的前面加上global x就行了,像:
def f():
global x
x=0
print(x)
1、定義一個(gè)使用不定長(zhǎng)參數(shù)的函數(shù),并在函數(shù)中打印出參數(shù)及其類(lèi)型,統(tǒng)計(jì)傳入?yún)?shù)的個(gè)數(shù)
def test(a,b,*args,c=10,**kwargs): ??
print("a=",a)
print("b=",b)
print("args=",args)
print("c=",c)
print("kwargs=",kwargs)
print("參數(shù)總長(zhǎng)度:",1+1+len(args)+1+len(kwargs))
test(1,2,3,4,5,m=4)
def test(a,b,c=10,*args,**kwargs): ? ?
print("a=",a)
print("b=",b)
print("args=",args)
print("c=",c)
print("kwargs=",kwargs)
print("參數(shù)總長(zhǎng)度:",1+1+len(args)+1+len(kwargs))
test(1,2,3,4,5,m=4)
2、定義一個(gè)函數(shù)max,接受的參數(shù)類(lèi)型是數(shù)值,最終返回兩個(gè)數(shù)中的最大值
def max(num1,num2):
if num1num2:
return num1
else:
return num2
3、定義一個(gè)函數(shù)min,接受的參數(shù)類(lèi)型是數(shù)值,最終返回兩個(gè)數(shù)中的最小值
def min(num1,num2):
if num1num2:
return num1
else:
return num2
4、分別定義加減乘除四個(gè)函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)之間的加減乘除操作
# 加法
def add(a,b):
return a+b
# 減法
def sub(a,b):
return a-b
# 乘法
def mul(a,b):
return a*b
# 除法
def div(a,b):
if b==0:
return 0
else:
return a/b
5、分別定義加減乘除四個(gè)函數(shù),然后實(shí)現(xiàn)多個(gè)數(shù)之間的累加累減累除累乘操作,如[1,2,3,4,5],累加即是1+2+3+4+5,注意當(dāng)使用除法時(shí),應(yīng)判斷被除數(shù)不能為0
#累加
def add(a,b,*args):
s=a+b
for i in args:
s=s+i
return s
#累減
def sub(a,b,*args):
s=a-b
for i in args:
s=s-i
return s
#累乘
def mul(a,b,*args):
s=a*b
for i in args:
s=s*i
return s
#累除
def div(a,b,*args):
if b==0:
return a
else:
s=a/b
for i in args:
if i ==0:
continue
else:
s=a/b
return s
6、使用不定長(zhǎng)參數(shù)定義一個(gè)函數(shù)max_min,接受的參數(shù)類(lèi)型是數(shù)值,最終返回這些數(shù)中的最大值和最小值——錯(cuò)題
def max_min(*args):
max=0
min=0
if len(args)==0:
return 0,0
elif len(args)==1:
return args[0],args[0]
else:
max=args[0]
min=args[0]
for i in args:
if maxi:
max=i
if mini:
min=i
return max,min
7、定義一個(gè)函數(shù),返回n的階乘的最后結(jié)果,并打印出如5階乘"5!=120”的效果——錯(cuò)題
def f(n):
s=1
for i in range(n):
s=s*(i+1)
print('%s!=%s' %(n,s))?
f(5)
8、定義一個(gè)函數(shù),返回由n(包含n)以?xún)?nèi)的奇數(shù)或者偶數(shù)組成的列表,默認(rèn)返回全是奇數(shù)的列表
def?f(n,type='j'):
ls=[]
if?type=='j':
for?i?in?range(1,n+1):
if?i%2==1:
ls.append(i)
if?type=='o':
for?i?in?range(1,n+1):
if?i%2==0:
ls.append(i)
return?ls
9、定義一個(gè)函數(shù),打印出n以?xún)?nèi)的所有的素?cái)?shù)(指在大于1的自然數(shù)中,除了1和它本身以外不再有其他因數(shù)的自然數(shù)。)——錯(cuò)題
def f(n):
ls=[2]
for i in range(3,n):
for j in range(2,i):
if i%j == 0:
break
else:
ls.append(i)
print(ls)
10、定義一個(gè)函數(shù),接受三個(gè)參數(shù),分別為字符串s、數(shù)值a1、數(shù)值a2,將字符串s從下標(biāo)a1開(kāi)始的a2個(gè)字符刪除,并把結(jié)果返回,a2默認(rèn)值為0——錯(cuò)題
def cut_str(s,a1,a2=0):
length = len(s)
if a1+1length or a2 == 0:
return s
else:
s1 = s[:a1]
s2 = s[a1+a2:]
return s1+s2
print(cut_str("hello",6,1))
11、請(qǐng)定義兩個(gè)函數(shù),一個(gè)函數(shù)畫(huà)正方形,一個(gè)函數(shù)畫(huà)三角形,并且可以從鍵盤(pán)輸入值來(lái)決定畫(huà)正方形還是畫(huà)三角形以及決定是否退出程序
我的答案:
import turtle
def z():
for i in range(4):
turtle.fd(20)
turtle.right(90)
def s():
for i in range(3):
turtle.fd(20)
turtle.right(120)
m=input('請(qǐng)輸入值,z畫(huà)正方形,s畫(huà)三角形,其它任意鍵退出程序:')
if m =='z':
z()
elif m=='s':
s()
else:
print('退出程序')
官方答案:
def square(n):
for i in range(n):
print("*"*n)
def triangle(n):
for i in range(n):
print("*"*(i+1))
12、定義函數(shù)findall,實(shí)現(xiàn)對(duì)字符串find方法的進(jìn)一步封裝,要求返回符合要求的所有位置的起始下標(biāo),如字符串"helloworldhellopythonhelloc++hellojava",需要找出里面所有的"hello"的位置,最后將返回一個(gè)元組(0,10,21,29),即將h的下標(biāo)全部返回出來(lái),而find方法只能返回第一個(gè)——沒(méi)懂
def findall(string, s):
ret = []
if s=='':
return ret
while True:
index = string.find(s)
if index != -1:
if len(ret)!=0:
ret.append(ret[-1]+index+len(s))
else:
ret.append(index)
string = string[index+len(s):]
else:
break
return ret
print(findall("abc-abc-abc-","-"))