python中的函數

Python 函數

  函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段。python

  函數能提升應用的模塊性,和代碼的重複利用率。你已經知道Python提供了許多內建函數,好比print()。但你也能夠本身建立函數,這被叫作用戶自定義函數。express

定義一個函數

  你能夠定義一個由本身想要功能的函數,如下是簡單的規則:數組

  • 函數代碼以def關鍵詞開關,後接函數標識符名稱和圓括號()
  • 任何傳入參數和自變量必須放在圓括號中間,圓括號之間能夠用於定義參數
  • 函數的第一行語句能夠選擇性地使用文檔字符串——用於存放函數說明
  • 函數內容以冒號起始,而且縮進
  • return[表達式]結束函數,選擇性地返回一個值給調用方,不帶表達式的return至關於返回None

語法:app

#定義函數
def printme (abc):
    "打印傳入的字符串到標準顯示設備上"
    print(abc)
    return
printme("第一次調用自定義函數!")
printme("再次調用同一函數")

以上實例輸出結果:函數

第一次調用自定義函數!
再次調用同一函數

按值傳遞參數和按引用傳遞參數性能

全部參數(自變量)在python裏都是按引用傳遞,若是你在函數裏修改了參數,那麼在調用這個函數的函數裏,原始的參數也被改變了。例如:ui

def changeme(mylist):
    "修改傳入的列表"
    mylist.append([1,2,3,4]);
    print("函數內取值",mylist)
    return

#調用changme函數 mylist = [10,20,30]; changeme(mylist); print("函數外取值:",mylist)

傳入函數的和在末尾添加新內容的對象用的是同一個引用,故輸出結果以下:spa

函數內取值: [10, 20, 30, [1, 2, 3, 4]]
函數外取值: [10, 20, 30, [1, 2, 3, 4]]

參數code

如下是調用函數時可以使用的正式參數類型:orm

  • 必備參數
  • 關鍵字參數
  • 默認參數
  • 不定長參數

必備參數

必備參數須以正確的順序傳入函數,調用時的數量必須和聲明時的同樣

用戶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)

內置參數 

初學者的瞭解,分類可能不許確,一塊兒交流。

1、數學運算類

abs(x) 求絕對值
一、參數能夠是整型,也能夠是複數
二、若參數是複數,則返回複數的模
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類型

 

2、集合類操做

 

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對象,它的行爲與列表類似,可是隻在須要時才計算列表值,當列表很大時,這個特性能爲咱們節省內存

 

3、邏輯判斷

all(iterable) 一、集合中的元素都爲真的時候爲真
二、特別的,若爲空串返回爲True
any(iterable) 一、集合中的元素有一個爲真的時候爲真
二、特別的,若爲空串返回爲False
cmp(x, y) 若是x < y ,返回負數;x == y, 返回0;x > y,返回正數

 

4、反射

callable(object) 檢查對象object是否可調用
一、類是能夠被調用的
二、實例是不能夠被調用的,除非類中聲明瞭__call__方法
classmethod() 一、註解,用來講明這個方式是個類方法
二、類方法便可被類調用,也能夠被實例調用
三、類方法相似於Java中的static方法
四、類方法中不須要有self參數
compile(source, filename, mode[, flags[, dont_inherit]]) 將source編譯爲代碼或者AST對象。代碼對象可以經過exec語句來執行或者eval()進行求值。
一、參數source:字符串或者AST(Abstract Syntax Trees)對象。
二、參數 filename:代碼文件名稱,若是不是從文件讀取代碼則傳遞一些可辨認的值。
三、參數model:指定編譯代碼的種類。能夠指定爲 ‘exec’,’eval’,’single’。
四、參數flag和dont_inherit:這兩個參數暫不介紹
dir([object]) 一、不帶參數時,返回當前範圍內的變量、方法和定義的類型列表;
二、帶參數時,返回參數的屬性、方法列表。
三、若是參數包含方法__dir__(),該方法將被調用。當參數爲實例時。
四、若是參數不包含__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)]
一、參數function:返回值爲True或False的函數,能夠爲None
二、參數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數組
一、若是source爲整數,則返回一個長度爲source的初始化數組;
二、若是source爲字符串,則按照指定的encoding將字符串轉換爲字節序列;
三、若是source爲可迭代類型,則元素必須爲[0 ,255]中的整數;
四、若是source爲與buffer接口一致的對象,則此對象也能夠被用於初始化bytearray.
zip([iterable, ...])  實在是沒有看懂,只是看到了矩陣的變幻方面

 

5、IO操做

file(filename [, mode [, bufsize]]) file類型的構造函數,做用爲打開一個文件,若是文件不存在且mode爲寫或追加時,文件將被建立。添加‘b’到mode參數中,將對文件以二進制形式操做。添加‘+’到mode參數中,將容許對文件同時進行讀寫操做
一、參數filename:文件名稱。
二、參數mode:'r'(讀)、'w'(寫)、'a'(追加)。
三、參數bufsize:若是爲0表示不進行緩衝,若是爲1表示進行行緩衝,若是是一個大於1的數表示緩衝區的大小 。
input([prompt])  獲取用戶輸入
推薦使用raw_input,由於該函數將不會捕獲用戶的錯誤輸入
open(name[, mode[, buffering]])  打開文件
與file有什麼不一樣?推薦使用open
print 打印函數
raw_input([prompt])  設置輸入,輸入都是做爲字符串處理

 

其餘

help()--幫助信息

內置函數,通常都是由於使用頻率比較頻繁或是是元操做,因此經過內置函數的形式提供出來,經過對python的內置函數分類分析能夠看出來:基本的數據操做基本都是一些數學運算(固然除了加減乘除)、邏輯操做、集合操做、基本IO操做,而後就是對於語言自身的反射操做,還有就是字符串操做,也是比較經常使用的,尤爲須要注意的是反射操做。

相關文章
相關標籤/搜索