Python第七天 函數 函數參數 函數變量 函數返回值 多類型傳值 冗余參數 函數遞歸調用 匿名函數 內置函數 列表表達式/列表重寫
目錄
Python第二天 變量 運算符與表達式 input()與raw_input()區別 字符編碼
Python第三天 序列 數據類型 數值 字符串 列表 元組 字典
Python第四天 流程控制 ifelse條件判斷 forwhile循環
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函數
函數就是完成特定功能的一個語句組,這組語句可以作為一個單位使用,并且給它取一個名字。
可以通過函數名在程序的不同地方多次執行(這通常叫函數調用)。
預定義函數
可以直接使用
自定義函數
用戶自己編寫
函數的定義和調用
//定義
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對象。
------------------------------------------
函數參數
形式參數和實際參數
- 在定義函數時,函數名后面括號中的變量名稱叫做“形式參數”,或者稱為“形參”
- 在調用函數時,函數名后面括號中的變量名稱叫做“實際參數”,或者稱為“實參”
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 第二個參數
#!/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:列出目錄下的所有文件和目錄,列表形式,每個列表元素都是字符串
#!/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
for i in os.listdir('/proc'):
isNum(i)
或
#!/usr/bin/python
import sys
import os
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/python
x = 100
def fun():
global x
x += 1
print x
fun()
print x
globals函數打印當前環境的所有全局變量,返回字典
locals函數打印當前環境的所有局部變量,返回字典
#!/usr/bin/python
x = 100
def fun():
x = 1
y = 1
print locals()
fun()
print locals()
---------------------------------
函數返回值
- 函數被調用后會返回一個指定的值
- 函數調用后默認返回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否則會報錯
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)
打印目錄下所有文件
def print_files(path):
isdir, isfile, join = os.path.isdir, os.path.isfile, os.path.join
lsdir = os.listdir(path)
dirs = [i for i in lsdir if isdir(join(path,i))]
files = [i for i in lsdir if isfile(join(path,i))]
if dirs:
for d in dirs:
print_files(join(path,d))
if files:
for f in files:
print join(path,f)
print_files(sys.argv[1])
--------------------------------------
匿名函數
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()
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)) 從中創建字典
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
文章列表
| 不含病毒。www.avast.com |
