Python第七天 函數 函數參數 函數變量 函數返回值 多類型傳值 冗余參數 函數遞歸調用 匿名函數 內置函數 列表表達式/列表重寫
目錄
Python第二天 變量 運算符與表達式 input()與raw_input()區別 字符編碼 python轉義符 字符串格式化
Python第三天 序列 5種數據類型 數值 字符串 列表 元組 字典
Python第四天 流程控制 if else條件判斷 for循環 while循環
Python第五天 文件訪問 for循環訪問文件 while循環訪問文件 字符串的startswith函數和split函數
Python第七天 函數 函數參數 函數變量 函數返回值 多類型傳值 冗余參數 函數遞歸調用 匿名函數 內置函數 列表表達式/列表重寫
Python第八天 模塊 包 全局變量和內置變量__name__ Python path
Python第九天 面向對象 類定義 類的屬性 類的方法 內部類 垃圾回收機制 類的繼承 裝飾器
Python第十天 print >> f,和fd.write()的區別 stdout的buffer 標準輸入 標準輸出 標準錯誤 重定向 輸出流和輸入流
Python第十二天 收集主機信息 正則表達式 無名分組 有名分組
Python第十四天 序列化 pickle模塊 cPickle模塊 JSON模塊 API的兩種格式
Python第十五天 datetime模塊 time模塊 thread模塊 threading模塊 Queue隊列模塊 multiprocessing模塊 paramiko模塊 fabric模塊
Python函數
函數就是完成特定功能的一個語句組,這組語句可以作為一個單位使用,并且給它取一個名字。
可以通過函數名在程序的不同地方多次執行(這通常叫函數調用)。
函數定義要在函數調用之前,否則函數調用會找不到要調用的函數 跟編譯型語言不一樣!!!!!!!!!
函數要寫在python文件的最前面,否則NameError: name 'wordCount' is not defined
import os import sys import string s="""hello world python""" wordCount(s) def wordCount(s): chars=len(s) words=len(s.split()) lines=s.count('\n') print lines,words,chars Traceback (most recent call last): File "G:/py/pytest33/test123.py", line 20, in <module> wordCount(s) NameError: name 'wordCount' is not defined
預定義函數
可以直接使用
自定義函數
用戶自己編寫
函數的定義和調用
//定義
def 函數名([參數列表]):
函數名:如果由多個單詞組成,第二個單詞的首字母應該大寫
//調用
函數名([參數列表])
#!/usr/bin/python
def fun():
sth = raw_input("Please input something: ")
try:
if type(int(sth)) == type(1):
print "%s is a number" %sth
except ValueError:
print "%s is not number" %sth
fun()
最好這樣寫if type(int(num)) == type(1)
type返回的不是字符串,是type對象。
函數名賦值給變量
int2give = int
print int2give('3')
------------------------------------------
函數參數
形式參數和實際參數
- 在定義函數時,函數名后面括號中的變量名稱叫做“形式參數”,或者稱為“形參”
- 在調用函數時,函數名后面括號中的變量名稱叫做“實際參數”,或者稱為“實參”
in的用法
if i in '0123456789'
if plus_one in range(10)
sys.argv跟shell內置變量一樣
sys.argv[0] 相當于 $0表示腳本本身
sys.argv[1] 相當于 $1 第一個參數
sys.argv[2] 相當于 $2 第二個參數
sys.argv 返回所有參數列表['memory.py', '2', 'uu']
len(sys.argv) 參數的個數
#!/usr/bin/python
import sys
import os
def isNum(s):
for i in s:
if i in '0123456789':
pass
else:
#print "%s is not a number" %s
break
else:
print s
isNum(sys.argv[1])
----------------------------------
練習
打印系統的所有PID
要求從/proc讀取。
os.listdir()
os.listdir:列出目錄下的所有文件和目錄,列表形式,每個列表元素都是字符串
打印系統的所有PID 要求從/proc讀取。 os.listdir() os.listdir:列出目錄下的所有文件和目錄,列表形式,每個列表元素都是字符串 #!/usr/bin/env python # -*- coding:utf-8 -*- # __author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ import os import sys import string def isNum(s): for i in s: if i in '0123456789': pass else: # print "%s is not a number" %s break else: print s for i in os.listdir('/proc'): isNum(i) 或 #!/usr/bin/env python # -*- coding:utf-8 -*- # __author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ import os import sys import string def isNum(s): if s in '0123456789': print s for i in os.listdir('/proc'): isNum(i)
----------------------------------------------------------
函數默認參數
缺省參數(默認參數)
def fun(x, y=100):
print x,y
默認參數只能寫在最右邊,否則會報錯 def fun(y=100,x): 這個報錯
fun(1,2)
fun(x=1,y=2) 傳參的另一種方式,不過比較啰嗦很少用
fun(1)
---------------------------------------------------------
函數變量
局部變量和全局變量
- Python中的任何變量都有特定的作用域
- 在函數中定義的變量一般只能在該函數內部使用,這些只能在程序的特定部分使用的變量我們稱之為局部變量
- 在一個文件頂部定義的變量可以供文件中的任何函數調用,這些可以為整個程序所使用的變量稱為全局變量
global語句
global 變量名
強制聲明為全局變量
全局變量在函數外聲明,在函數里面global引用全局變量
在函數里面global聲明全局變量,在函數外可以引用這個全局變量
#!/usr/bin/env python # -*- coding:utf-8 -*- # __author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ import os import sys import string x = 100 def fun(): global x x += 1 print x fun() print x
globals函數打印當前環境的所有全局變量,返回字典
locals函數打印當前環境的所有局部變量,返回字典
#!/usr/bin/env python # -*- coding:utf-8 -*- # __author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ import os import sys import string x = 100 def fun(): x = 1 y = 1 print locals() fun() print globals()
-------------------------------------------------------
函數返回值
- 函數被調用后會返回一個指定的值
- 函數調用后默認返回None
- return 返回值
- 返回值可以是任意類型
- return執行后,函數終止
- return與print區別
------------------------------
多類型傳值
元組傳參
實參前面加一個* 傳入元組,元組要放在右邊
def fun(x,y,z)
return x+y+z
t1=(2,3,4)
t=(1,2)
fun(*t1)
fun(*(1,2,3))
fun(1,*t)
字典傳參
字典的key的名字要跟形參的名字一樣,x,y,z否則會報錯
def fun(x,y,z)
return x+y+z
dic = {'x':1,'y':3,'z':5}
fun(**dic)
冗余參數
向函數傳元組和字典
處理多余實參
def fun(x,y,*args,**kwargs)
fun(1,2,'a',[2,4],y=2,z=3)
fun(1,2,'a',[2,4],*t,y=2,**{'u':12})
--------------------------------
函數遞歸調用
計算階層
遞歸調用
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
print factorial(5)
注意事項
必須有最后的默認結果: if n == 0
遞歸參數必須向默認結果收斂的: factorial(n-1)
打印目錄下所有文件
#!/usr/bin/env python # -*- coding:utf-8 -*- # __author__="huazai" """ pycharm 使用指南 Date:2016.08.12 """ import os import sys import string def print_files(path): # isdir, isfile, join = os.path.isdir, os.path.isfile, os.path.join # print isdir,isfile,join lsdir = os.listdir(path) dirs = [i for i in lsdir if os.path.isdir(os.path.join(path, i))] files = [i for i in lsdir if os.path.isfile(os.path.join(path, i))] if dirs: for d in dirs: print_files(os.path.join(path, d)) if files: for f in files: print os.path.join(path, f) print_files(sys.argv[1]) 把函數名賦值給變量 # isdir, isfile, join = os.path.isdir, os.path.isfile, os.path.join # print isdir,isfile,join
---------------------------------------------------------------------------
匿名函數
lambda函數是一種快速定義單行的最小函數,可以用在任何需要函數的地方。
lambda語句中,冒號前是參數,可以有多個,逗號隔開,冒號右邊是返回值。
lambda語句構建的其實是一個函數對象
def fun(x, y):
return x*y
fun(2, 3)
r = lambda x,y: x*y
r(2, 3)
def add(x, y):
return x + y
sum = reduce(add, [1, 2, 3])
reduce(lambda x,y:x+y, range(1,4))
匿名函數優點:
- 1.使用python寫一些腳本時,使用lambda可以省去定義函數的過程,讓代碼更加精簡。
- 2. 對于一些抽象的,不會被別的地方再重復使用的函數,有時候函數起個名字也是個難題,使用lambda不需要考慮命名的問題。
- 3. 使用lambda在某些時候讓代碼更容易理解。
-------------------------------------------
內置函數
所有內置函數和內置類都在__builtin__模塊(__builtin__前后雙下劃線)
查詢內置函數和類
https://docs.python.org/2/library/index.html
絕對值,最大最小值
abs()
max()
max('12345','789')
字符串'789‘比字符串’12345‘大,字符串是從左到到右開始比較的,'7’比‘1'大,所以輸出’789'
min()
len() 參數是一個對象(字符串,元組,字典)不能是整數
divmod() 參數是兩個數字,返回商和余數
pow() 乘方
round() 給出小數點的精度,沒有第二個參數直接四舍五入
常用函數
callable() 可被調用的,例如類,函數
type()
isinstance() isinstance(s,(int,tuple,str)),s是一個對象,第二個參數是元組,判斷s這個對象的數據類型在不在第二個參數元組里,是返回true ,否返回false
class A(object): pass a=A() print isinstance(a,A)
cmp() 如果是字符串,則逐個字符比較,一旦有字符比較出來就不往下比較
range()
xrange()
類型轉換函數
int() 參數如果是字符串,只能是純數字字符串,不能帶小數
long() 參數如果是字符串,只能是純數字字符串,不能帶小數
float() 參數如果是字符串,只能是純數字字符串,不能帶小數
complex()
str()
list()
tuple()
hex()
oct()
chr() 輸入0<x<256 返回ascii字符
ord() 輸入ascii的單個字母,返回數字
eval() 將有效表達式求值,其實就是去掉字符串
字符串處理函數
下面函數實例化一個string對象或聲明一個string變量
str.capitalize() 將字符串里的第一個字符大寫并返回
str.replace() replace(old,new,count)
str.split() 字符串切成列表 不指定分隔符,那么默認以空格,tab鍵,換行符作為分隔 split('.',1) 點為分隔,切1次
str.join() 列表連接為字符串 ''.join([str(i) for i in range(10)]) join會在被插入字符中間插入 ','.join([str(i) for i in range(10)]) 逗號變為的分隔符
s= 'sdf'
s.join('22')
'2sdf2'
靜態函數,不需要實例化一個string對象
string模塊 import string
string.capitalize('hello')
string.replace('wecan','a','t')
string.split('we,w,e',',')
string.join('ww','tt')
序列處理函數
len()
max()
min()
filter() filter(none/func, seq) 如果不是none,func這個函數依次對sequence里的元素做處理,最后返回一個list, tuple, or string。
zip() 合并多個列表、元組
l1=[1,2,3]
l2=['a','b','c']
zip(l1,l2)
[(1, 'a'), (2, 'b'), (3, 'c')]
dict(zip(l1,l2)) 從中創建字典
l1=(1,2,3)
l2=['a','b','c']
print zip(l1,l2)
[(1, 'a'), (2, 'b'), (3, 'c')]
map() map(none,l1,l2,l3)跟zip函數一樣,元素最少的那個序列以none補充,map(func,seq)對序列的每個元素都放進去函數里去處理,并且函數參數要與序列元素個數相同
與filter(func, seq)類似,但是filter(func, seq)只能處理單個序列
reduce() 函數, reduce(func,seq)
使用lambda代入序列處理函數
filter(lambda x:x %2 ==0, range(10))
[0, 2, 4, 6, 8]
map(lambda x,y:x*y, range(5),range(5))
[0, 1, 4, 9, 16]
reduce(lambda x,y:x+y, range(1,101))
5050
列表表達式/列表重寫
[i*2+10 for i in range(10)]
[i for i in range(10) if i%3 == 0]
提示
16行報錯,vim +16 xx.py
函數的參數不能是連字符
def f(x, **kwargs):
print x
print kwargs
f(1,a=10,b-b=20) 報錯 涉及變量的命名
f(1,a=10,b_b=20) 正確
變量的命名
- 變量名由字母、數字、下劃線組成。
- 變量不能以數字開頭
- 不可以使用關鍵字
In [1]: def f(x, **kwargs):
...: print x
...: print kwargs
...: f(1,a=10,b-b=20)
File "<ipython-input-1-35f95bb06c84>", line 4
f(1,a=10,b-b=20)
SyntaxError: keyword can't be an expression
文章列表