文章目錄
一、 函數
在交互式命令行通過help(函數名)
查看函數的幫助信息
1 基本函數
-
print()
函數print()
print會依次打印每個字符串,遇到逗號“,”會輸出一個空格,print自動換行
-
input()
函數input()
,input輸入的是str
類型的a = input('name:')
會輸出提示信息 -
int()
函數數據類型轉換,將str轉換爲整數
例:
b = int(s)
-
abs
函數求絕對值
-
max()
函數可以接收任意多個參數,並返回最大的
-
hex()
函數把一個整數轉換成十六進制表示的字符串
-
range()
函數可以生成一個整數序列,從0開始生產
list()
函數可以轉換爲listprint(list(range(5)))
-
isinstance
函數可以判斷一個變量是不是什麼
isinstance(x, ...)
-
sum函數
可以直接求和
2 定義函數
-
使用
def
語句,依次寫出函數名、括號、括號中的參數和冒號:
-
在縮進塊中編寫函數體,函數的返回值用
return
語句返回例
def my_abs(x):
(1)定義一個空函數:
用pass
語句
例:def nop():
pass
(2)函數的參數
1.位置參數:
-
調用函數時,傳入的兩個值按照位置順序依次賦給參數
例:
def power(x):
2.默認參數:
-
必選參數在前,默認參數在後
-
當函數有多個參數時,把變化大的參數放前面,變化小的參數放後面。變化小的參數就可以作爲默認參數
-
可以按順序提供默認參數
-
可以不按順序提供部分默認參數,但需將參數名加上
默認參數必須指向不變對象
例:
def enroll(name, gender, age=6, city='Beijing'):
3.可變參數:
-
*args
是可變參數,args接收的是一個tuple -
*nums
表示把nums
這個list的所有元素作爲可變參數傳進去 -
可變參數允許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝爲一個tuple
-
可變參數既可以直接傳入:
func(1, 2, 3)
,又可以先組裝list或tuple,再通過*args
傳入:func(*(1, 2, 3))
例:
def calc(*numbers):
4.關鍵字參數:
-
**kw
是關鍵字參數,kw接收的是一個dict -
關鍵字參數允許傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個dict
-
可以擴展函數的功能
-
函數的調用者可以傳入任意不受限制的關鍵字參數
-
關鍵字參數既可以直接傳入:
func(a=1, b=2)
,又可以先組裝dict,再通過**kw
傳入:func(**{'a': 1, 'b': 2})
。例:
def person(name, age, **kw):
5.命名關鍵字參數
- 命名的關鍵字參數是爲了限制關鍵字參數,同時可以提供默認值(可以有缺省值)。
*
後面的是命名關鍵字參數,如果已經有了可變參數,就不需要再加一個*
- 命名關鍵字必須傳入參數名
- 每一個命名關鍵字參數都必須有值
- 定義命名的關鍵字參數在沒有可變參數的情況下不要忘了寫分隔符
*
,否則定義的將是位置參數。
6.參數組合
- 參數定義的順序必須是:位置參數、默認參數、可變參數(
*
)、命名關鍵字參數(*
)和關鍵字參數(**
)
(3)參數檢查
數據類型檢查可以用內置函數isinstance()
實現
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
(4)返回多個值(返回tuple)
Python的函數返回多值其實就是返回一個tuple
返回一個tuple可以省略括號,而多個變量可以同時接收一個tuple,按位置賦給對應的值
二、高級特性
1、切片
L[起始索引:結束索引:間隔大小]
,若第一個索引爲0,可省略;若間隔大小爲1,可省略;可以全部省略,則爲複製
L[0:3]
:0 <= L < 3 (不包含3)
可對list、tuple、字符串進行切片,靈活
支持倒數切片
2、迭代Iteration
for
循環來遍歷這個list或tuple,這種遍歷我們稱爲迭代(Iteration)
在Python中,迭代是通過for ... in
來完成的
dict的儲存不是按照list的方式順序排列的,迭代出的結果順序可能不一樣
dict
迭代:
- 默認情況下,dict迭代的是key
- 如果要迭代value,可以用
for value in d.values()
- 如果要同時迭代key和value,可以用
for k, v in d.items()
。
如何判斷一個對象是可迭代對象呢?
方法是通過collections模塊的Iterable
類型判斷:
from collections import Iterable
isinstance('abc', Iterable)
Python內置的enumerate
函數可以把一個list變成索引-元素對,這樣就可以在for
循環中同時迭代索引和元素本身:
for i, value in enumerate(['A', 'B', 'C']):
print(i, value)
任何可迭代對象都可以作用於for
循環,包括我們自定義的數據類型,只要符合迭代條件,就可以使用for
循環
3、列表生成式
用來創建list的生成式
for循環創建list的生成式
[x * x for x in range(1, 11)]
4、生成器generator
這種一邊循環一邊計算的機制,稱爲生成器:generator
- 創建一個generator
- 1、方法很簡單,只要把一個列表生成式的
[]
改成()
- 2、函數定義中包含
yield
關鍵字,那麼這個函數是一個generator
- 1、方法很簡單,只要把一個列表生成式的
generator的函數,在每次調用next()
的時候執行,遇到yield
語句返回,再次執行時從上次返回的yield
語句處繼續執行
-
調用
調用generator時,首先要生成一個generator對象,然後用
next()
函數不斷獲得下一個返回值 -
返回值
用
for
循環調用generator時,發現拿不到generator的return
語句的返回值。如果想要拿到返回值,必須捕獲StopIteration
錯誤,返回值包含在StopIteration
的value
中: -
結束
對於函數改成的generator來說,遇到
return
語句或者執行到函數體最後一行語句,就是結束generator的指令,for
循環隨之結束。
5、迭代器Iterator
-
可以直接作用於for循環的數據類型有:
- list、tuple、dict、set、str
- generator(包括生成器和帶yield的函數)
-
可以直接作用於
for
循環的對象統稱爲可迭代對象:Iterable
-
可以使用
isinstance()判斷一個對象是否是Iterable對象
-
from collections import Iterable
例:
from collections import Iterable
isinstance([], Iterable)
-
-
被
next()
函數調用並不斷返回下一個值的對象稱爲迭代器:Iterator
-
可以使用
isinstance()
判斷一個對象是否是Iterator
對象例:
from collections import Iterator
isinstance((x for x in range(10)), Iterator)
-
-
使用
iter()
把list、dict、str
等Iterable
變成Iterator
三、函數式編程
1、高階函數
函數就是面向過程的程序設計的基本單元
函數本身也可以賦值給變量,即:變量可以指向函數
函數名其實就是指向函數的變量
高階函數:一個函數就可以接收另一個函數作爲參數
-
map/reduce
-
map(兩個參數)
map函數接受兩個參數,一個函數,一個是
Iterable
,map將傳入的函數依次作用到序列的每個元素,並把結果作爲新的Iterable
放回Iterator
是惰性序列,通過list()
函數讓它把整個序列都計算出來並返回一個list -
reduce(兩個參數)
把一個函數作用在一個序列
[x1,x2,x3,x4......]
上這個函數必須接受兩個參數,reduce把結果繼續和下一個元素做累計計算
reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
-
-
filter:過濾序列(兩個參數)
接收一個函數與一個序列,與map類似依次作用於每個元素,但根據返回值確定是否丟棄元素
返回值也是一個Iterator(惰性序列),需要list函數獲取結果並返回list
-
sorted:排序算法(三個參數)
可以接收一個key函數來實現自定義的排序
例:
sorted([3,65,3,4],key=abs)
忽略大小寫:
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
進行反向排序,傳入第三個參數
reverse=True
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
2、返回函數
相關參數和變量都保存在返回的函數中,稱爲“閉包”
每次調用互不影響
返回的函數不會立刻執行
返回函數不要引用任何循環變量,或者後續會發生變化的變量,如果使用的話,多次調用的結果會相同
3、匿名函數(lambda
)
關鍵字lambda
表示匿名函數,冒號前面的x表示函數參數
list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
匿名函數只能有一個表達式,不用寫return,返回值就是該表達式的結果
匿名函數不會衝突
匿名函數也是一個函數對象,可以把匿名函數賦值給一個變量,也可以吧匿名函數作爲返回值返回
def build(x, y): return lambda: x * x + y * y
4、裝飾器(@
)
在代碼運行期間增加功能的方式,稱爲“裝飾器”(Decorator)
函數有一個__name__
可以拿到函數的名字
functools.wrap
<==>wrapper.__name__ = func.__name__
(交換函數簽名)
一個完整的decorator:
import functools
def log(func):
@functools.warps(func)
5、偏函數(functools.partial
)
偏函數(Partial function):把一個函數的某些參數固定
functools.partial
創建一個偏函數,給一個函數設定默認參數(在函數調用的時候也可以傳入其他值),返回一個新函數
int2 = functools.paratial(int,base=2)
創建偏函數的時候,可以接收函數對象
、*args
、**kw
四、 模塊
作用域
- 公開(public):正常的函數和變量名,可以被直接引用
- 特殊變量:
__xxx__
,定義自己的變量一般不用 - 私有(private):
_xxx
和__xxx
,不應該直接引用private函數