Python 函數
函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。
函數能提高應用的模塊性,和代碼的重復利用率。你已經知道Python提供了許多內建函數,比如print()。但你也可以自己創建函數,這被叫做用戶自定義函數。
定義一個函數
你可以定義一個由自己想要功能的函數,以下是簡單的規則:
- 函數代碼以def關鍵詞開關,後接函數標識符名稱和圓括號()
- 任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數
- 函數的第一行語句可以選擇性地使用文檔字符串——用於存放函數說明
- 函數內容以冒號起始,並且縮進
- return[表達式]結束函數,選擇性地返回一個值給調用方,不帶表達式的return相當於返回None
語法:
#定義函數
def printme (abc):
"打印傳入的字符串到標准顯示設備上"
print(abc)
return
printme("第一次調用自定義函數!")
printme("再次調用同一函數")
以上實例輸出結果:
第一次調用自定義函數!
再次調用同一函數
按值傳遞參數和按引用傳遞參數
所有參數(自變量)在python裡都是按引用傳遞,如果你在函數裡修改了參數,那麼在調用這個函數的函數裡,原始的參數也被改變了。例如:
def changeme(mylist):
"修改傳入的列表"
mylist.append([1,2,3,4]);
print("函數內取值",mylist)
return
#調用changme函數
mylist = [10,20,30];
changeme(mylist);
print("函數外取值:",mylist)
傳入函數的和在末尾添加新內容的對象用的是同一個引用,故輸出結果如下:
函數內取值: [10, 20, 30, [1, 2, 3, 4]]
函數外取值: [10, 20, 30, [1, 2, 3, 4]]
參數
以下是調用函數時可使用的正式參數類型:
必備參數
必備參數須以正確的順序傳入函數,調用時的數量必須和聲明時的一樣
用戶printme()函數,你必須傳入一個參數,不然會出現語法錯誤:
#可寫函數說明
def printme(str):
"打印任何傳入的字符串"
print(str)
return#調用printme函數
printme()
以上實例輸出結果:
Traceback (most recent call last):
File "F:/python/procject/day4/函數.py", line 26, in <module>
printme()
TypeError: printme() missing 1 required positional argument: 'str'
關鍵字參數:
關鍵字參數和函數調用關系緊密,函數調用使用關鍵字參數來確定傳入的參數值。
使用關鍵字參數允許函數調用時參數的順序與聲明時不一致,因為python解釋器能夠用參數名匹配參數值。
以下實例在函數printme()調用時使用參數名:
#可寫函數說明
def printme(str):
"打印任何傳入的字符串"
print(str)
return
#調用printme函數
printme(str = "My string")
以上實例輸出結果:
My string
下例能將關鍵字參數順序不重要展示得更清楚
def printinfo(name,age):
"打印任何傳入的字符串"
print("Name:",name)
print("Age:",age)
return
#調用printinfo函數
printinfo(age=50,name="miki")
以上實例輸出結果:
Name: miki
Age: 50
缺省參數
調用函數時,缺省參數的值如果沒有傳入,則被認為是默認值 ,下例會打印默認的age,如果age沒有被傳入:
#可寫函數說明
def printinfo(name,age = 35):
"打印任何傳入的字符串"
print("Name:",name)
print("Age:",age)
return
#調用printinfo函數
printinfo(age=50,name="miki")
printinfo(name="miki")
以上實例輸出結果:
Name: miki
Age: 50
Name: miki
Age: 35
匿名函數
python使用lambda來創建匿名函數:
- lambda只是一個表達式,函數體比def簡單很多
- lambda的主體是一個表達式,而不是一個代碼塊,僅僅能在lambda表達式中封裝有限的邏輯進去。
- lambda函數擁有自己的命名空間,且不能訪問自有參數列表之外或全局命名空間裡的參數。
- 雖然lambda函數看起來只能寫一行,卻不等同於C或C++的內聯函數,後者的目的是調用小函數時不占用棧內存從而增加運行效率
語法:
lambda函數的語法只包含一個語句,如下:
lambda[arg1[arg2,arg,.....agrn]]:expression
如下實例:
sum = lambda arg1,arg2:arg1+arg2;
#調用函數
print("相加後的值為:",sum(10,20))
print("相加後的值為:",sum(20,20))
以上實例輸出結果:
相加後的值為: 30
相加後的值為: 40
return語句
return語句[表達式]退出函數,選擇性地向調用方返回一個表達式,不帶參數值的return語句返回None。之前的例子都沒有示范如何返回數值,下例便告訴你怎麼做:
def sum(arg1,arg2):
# 返回2個參數的和."
total = arg1 + arg2
print("函數內:",total)
return total
#調用sum函數
total = sum(10,20)
以上實例輸出結果:
函數內: 30
變量作用域
一個程序的所有的變量並不是在哪個位置都可以訪問的。訪問權限決定於這個變量是在哪裡賦值的。變量的作用域決定了在哪一部分程序你可以訪問哪個特定的變量名稱。兩種最基本的變量作用域如下:
全局變量和局部變量
定義在函數內部的變量擁有一個局部作用域,定義在函數外的擁有全局作用域。
局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個程序范圍內訪問。調用函數時,所有在函數內聲明的變量名稱都將被加入到作用域中。如下實例:
total = 0
def sum(arg1,arg2):
#返回2個參數的和”
total = arg1+arg2 #total在這裡是局部變量
print("函數內是局部變量:",total)
return total
#調用函數
sum(10,20)
print("函數外是全局變量:",total)
以上實例輸出結果:
函數內是局部變量: 30
函數外是全局變量: 0
高階函數
變量可以指向函數,函數的參數能接收變量,那麼一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數。
def add(x,y,f):
return f(x) + f(y)
res = add(3,-6,abs) #abc 取絕對值
print(res)
內置參數
初學者的了解,分類可能不准確,一起交流。
一、數學運算類
abs(x)
求絕對值
1、參數可以是整型,也可以是復數
2、若參數是復數,則返回復數的模
complex([real[, imag]])
創建一個復數
divmod(a, b)
分別取商和余數
注意:整型、浮點型都可以
float([x])
將一個字符串或數轉換為浮點數。如果無參數將返回0.0
int([x[, base]])
將一個字符轉換為int類型,base表示進制
long([x[, base]])
將一個字符轉換為long類型
pow(x, y[, z])
返回x的y次冪
range([start], stop[, step])
產生一個序列,默認從0開始
round(x[, n])
四捨五入
sum(iterable[, start])
對集合求和
oct(x)
將一個數字轉化為8進制
hex(x)
將整數x轉換為16進制字符串
chr(i)
返回整數i對應的ASCII字符
bin(x)
將整數x轉換為二進制字符串
bool([x])
將x轉換為Boolean類型
二、集合類操作
basestring()
str和unicode的超類
不能直接調用,可以用作isinstance判斷
format(value [, format_spec])
格式化輸出字符串
格式化的參數順序從0開始,如“I am {0},I like {1}”
unichr(i)
返回給定int類型的unicode
enumerate(sequence [, start = 0])
返回一個可枚舉的對象,該對象的next()方法將返回一個tuple
iter(o[, sentinel])
生成一個對象的迭代器,第二個參數表示分隔符
max(iterable[, args...][key])
返回集合中的最大值
min(iterable[, args...][key])
返回集合中的最小值
dict([arg])
創建數據字典
list([iterable])
將一個集合類轉換為另外一個集合類
set()
set對象實例化
frozenset([iterable])
產生一個不可變的set
str([object])
轉換為string類型
sorted(iterable[, cmp[, key[, reverse]]])
隊集合排序
tuple([iterable])
生成一個tuple類型
xrange([start], stop[, step])
xrange()函數與range()類似,但xrnage()並不創建列表,而是返回一個xrange對象,它的行為與列表相似,但是只在需要時才計算列表值,當列表很大時,這個特性能為我們節省內存
三、邏輯判斷
all(iterable)
1、集合中的元素都為真的時候為真
2、特別的,若為空串返回為True
any(iterable)
1、集合中的元素有一個為真的時候為真
2、特別的,若為空串返回為False
cmp(x, y)
如果x < y ,返回負數;x == y, 返回0;x > y,返回正數
四、反射
callable(object)
檢查對象object是否可調用
1、類是可以被調用的
2、實例是不可以被調用的,除非類中聲明了__call__方法
classmethod()
1、注解,用來說明這個方式是個類方法
2、類方法即可被類調用,也可以被實例調用
3、類方法類似於Java中的static方法
4、類方法中不需要有self參數
compile(source, filename, mode[, flags[, dont_inherit]])
將source編譯為代碼或者AST對象。代碼對象能夠通過exec語句來執行或者eval()進行求值。
1、參數source:字符串或者AST(Abstract Syntax Trees)對象。
2、參數 filename:代碼文件名稱,如果不是從文件讀取代碼則傳遞一些可辨認的值。
3、參數model:指定編譯代碼的種類。可以指定為 ‘exec’,’eval’,’single’。
4、參數flag和dont_inherit:這兩個參數暫不介紹
dir([object])
1、不帶參數時,返回當前范圍內的變量、方法和定義的類型列表;
2、帶參數時,返回參數的屬性、方法列表。
3、如果參數包含方法__dir__(),該方法將被調用。當參數為實例時。
4、如果參數不包含__dir__(),該方法將最大限度地收集參數信息
delattr(object, name)
刪除object對象名為name的屬性
eval(expression [, globals [, locals]])
計算表達式expression的值
execfile(filename [, globals [, locals]])
用法類似exec(),不同的是execfile的參數filename為文件名,而exec的參數為字符串。
filter(function, iterable)
構造一個序列,等價於[ item for item in iterable if function(item)]
1、參數function:返回值為True或False的函數,可以為None
2、參數iterable:序列或可迭代對象
getattr(object, name [, defalut])
獲取一個類的屬性
globals()
返回一個描述當前全局符號表的字典
hasattr(object, name)
判斷對象object是否包含名為name的特性
hash(object)
如果對象object為哈希表類型,返回對象object的哈希值
id(object)
返回對象的唯一標識
isinstance(object, classinfo)
判斷object是否是class的實例
issubclass(class, classinfo)
判斷是否是子類
len(s)
返回集合長度
locals()
返回當前的變量列表
map(function, iterable, ...)
遍歷每個元素,執行function操作
memoryview(obj)
返回一個內存鏡像類型的對象
next(iterator[, default])
類似於iterator.next()
object()
基類
property([fget[, fset[, fdel[, doc]]]])
屬性訪問的包裝類,設置後可以通過c.x=value等來訪問setter和getter
reduce(function, iterable[, initializer])
合並操作,從第一個開始是前兩個參數,然後是前兩個的結果與第三個合並進行處理,以此類推
reload(module)
重新加載模塊
setattr(object, name, value)
設置屬性值
repr(object)
將一個對象變幻為可打印的格式
slice()
staticmethod
聲明靜態方法,是個注解
super(type[, object-or-type])
引用父類
type(object)
返回該object的類型
vars([object])
返回對象的變量,若無參數與dict()方法類似
bytearray([source [, encoding [, errors]]])
返回一個byte數組
1、如果source為整數,則返回一個長度為source的初始化數組;
2、如果source為字符串,則按照指定的encoding將字符串轉換為字節序列;
3、如果source為可迭代類型,則元素必須為[0 ,255]中的整數;
4、如果source為與buffer接口一致的對象,則此對象也可以被用於初始化bytearray.
zip([iterable, ...])
實在是沒有看懂,只是看到了矩陣的變幻方面
五、IO操作
file(filename [, mode [, bufsize]])
file類型的構造函數,作用為打開一個文件,如果文件不存在且mode為寫或追加時,文件將被創建。添加‘b’到mode參數中,將對文件以二進制形式操作。添加‘+’到mode參數中,將允許對文件同時進行讀寫操作
1、參數filename:文件名稱。
2、參數mode:'r'(讀)、'w'(寫)、'a'(追加)。
3、參數bufsize:如果為0表示不進行緩沖,如果為1表示進行行緩沖,如果是一個大於1的數表示緩沖區的大小 。
input([prompt])
獲取用戶輸入
推薦使用raw_input,因為該函數將不會捕獲用戶的錯誤輸入
open(name[, mode[, buffering]])
打開文件
與file有什麼不同?推薦使用open
print
打印函數
raw_input([prompt])
設置輸入,輸入都是作為字符串處理
其他
help()--幫助信息
內置函數,一般都是因為使用頻率比較頻繁或是是元操作,所以通過內置函數的形式提供出來,通過對python的內置函數分類分析可以看出來:基本的數據操作基本都是一些數學運算(當然除了加減乘除)、邏輯操作、集合操作、基本IO操作,然後就是對於語言自身的反射操作,還有就是字符串操作,也是比較常用的,尤其需要注意的是反射操作。