python 第一類物件 閉包 迭代器
阿新 • • 發佈:2018-12-11
########################總結###########################
1. 函式名 -> 第一類物件
函式名就是變數名.
函式可以賦值
函式可以作為集合類的元素
函式可以作為引數傳遞
函式可以作為返回值返回
2. 閉包
語法: 內層函式對外層函式的區域性變數的使用
def wrapper():
name = ""
def inner():
return name
return inner
如何檢視一個函式是否是閉包
函式名.__closure__ 有值就是閉包. None就不是閉包
優點:
1. 保護變數不被侵害 (javascript)
2. 可以讓一個變數常駐記憶體
3. 迭代器
在資料中包含了__iter__是一個可迭代物件.
for迴圈內部
it = lst.__iter__()
while 1:
try:
it.__next__()
except StopIteration:
break
特點:
1. 節省記憶體
2. 惰性機制
3. 只能向前, 不能反覆
意義: 統一資料型別的遍歷工作
官方檢視xxx是迭代器, 可迭代物件
from collections import Iterable, Iterator
isinstance(物件, Iterable)
isinstance(物件, Iterator)
迭代器一定可迭代 -> for迴圈
可迭代的不一定是迭代器
########################作業###########################
2,寫函式,接收n個數字,求這些引數數字的和。(動態傳參)
def number(*args): sum =0 for i in args: sum=i+sum return sum print(number(1,2,3,4,5,6))
3, 讀程式碼,回答:程式碼中, 打印出來的值a, b, c分別是什麼?為什麼?
a = 10 b = 20 def test5(a, b):print(a, b) # a = 20 b = 10 c = test5(b, a) print(c) # c = None c是None是因為沒有返回值,就是None
4.讀程式碼,回答:程式碼中, 打印出來的值a, b, c分別是什麼?為什麼?
a=10 b=20 def test5(a,b): a=3 b=5 print(a,b) #10 20 這個地方 如果推進去 就是3 5 c = test5(b,a) print(c) #none 沒有返回值 print(a,b) #10 20
5, 寫函式, 傳入函式中多個實參(均為可迭代物件如字串, 列表, 元祖, 集合等), 將每個實參的每個元素依次新增到函式的動態引數args裡面.
例如
傳入函式兩個引數[1, 2, 3](22, 33)
最終args為(1, 2, 3, 22, 33)
def func(*args): return args print(func(*[1, 2, 3],*(22, 33)))#分解的意思
6, 寫函式, 傳入函式中多個實參(實參均為字典), 將每個實參的鍵值對依次新增到函式的動態引數kwargs裡面.
例如
傳入函式兩個引數
例如 傳入函式兩個引數{‘name’:’alex’} {‘age’:1000}最終kwargs為{‘name’:’alex’ ,‘age’:1000}
def func(**args):
return args
print(func(**{'name1':'alex'},{'name2':1000}))#分解的意思
7, 下面程式碼成立麼?如果不成立為什麼報錯?怎麼解決?
a = 2 def wrapper(): print(a) wrapper() #內部變數引用外部變數 a = 2 def wrapper(): a += 1 #內部變數不能直接更改外部變數的資料 print(a) wrapper() def wrapper(): a = 1 def inner(): print(a)#區域性可以找到外部變數 inner() wrapper() def wrapper(): a = 1 def inner(): a += 1 print(a)#區域性變數不能更改外部變數的值 inner() wrapper()
8,寫函式,接收兩個數字引數,將較小的數字返回.
11111