1. 程式人生 > >python 第一類物件 閉包 迭代器

python 第一類物件 閉包 迭代器

########################總結###########################

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