1. 程式人生 > >day10_python_1124

day10_python_1124

認知: 隨著年齡閱歷的變化而變化。
01 去年內容回顧
*args **kwargs: 萬能引數,動態引數
* 魔性用法:
函式的定義時,* ** 聚合。
函式的執行時,* ** 打散。

形參順序:
位置引數,*args,預設引數,**kwargs
名稱空間:
臨時名稱空間:
內建名稱空間:
作用域:
全域性作用域:內建名稱空間,全域性名稱空間。
區域性作用域:臨時名稱空間(區域性名稱空間)。
載入順序: 內建名稱空間 全域性名稱空間 臨時名稱空間
取值順序:就近原則,LEGB。
內建函式:
globals(): 返回一個字典:全域性作用域的內容。
locals() : 返回一個字典:當前作用域的內容。
關鍵字:
global:
1,在區域性作用域可以宣告一個全域性變數。
2,在區域性作用域可以對全域性變數進行修改。
nonlocal:
1,不能對全域性變數進行修改。
2,子級對父級函式的變數的修改。

02 作業講解
03 函式名的運用
04 閉包
05 迭代器

 

#03 函式名的運用

#1 函式名是一個特殊的變數
# def func():
# print(666)
# print(func)
#2 函式名可以當做變數賦值
# f1 = 2
# f2 = f1
# f3 = f2
# print(f3)

# def func():
# print(333)
# func1 = func
# f2 = func1
# f3 = f2
# print(f3)
# f3()

#3 函式名可以當做容器類資料型別的元素
# def func1():
# print('in func1')
#
# def func2():
# print('in func2')
#
# def func3():
# print('in func3')
#
# l1 = [func1,func2,func3]
# for i in l1:
# i()

#4 函式名可以當做函式的引數
# def func(x):
# print(x)
# x()
# print('in func')
#
# def func1():
# print('in func1')
#
# func(func1)

#5 函式名可以當做函式的返回值
# def func(x):
# return x
#
# def func1():
# print('in func1')
#
# func(func1)()

#函式名也成為第一類物件

#04 閉包
#閉包:
#1,內層函式對外層函式(非全域性)變數的引用
#2,閉包只存在於內層函式中
#3,函式都要逐層返回,最終返回給最外層的函式

# 坑:引用也是閉包
# n = 'mo'
# def func(n):###n引用,相當於在裡面執行 n = 'mo'

#不是閉包例子:
# name = 'alex'
# def func():
# def inner():
# print(name)
# return inner
# f = func()
# print(f.__closure__[0].cell_contents) #??? /\

#閉包
# def func():
# name = 'alex'
# age = 12
# def inner():
# print(age)
# print(name)
# return inner
# f = func()
#獲取閉包引用的外層變數
# print(f.__closure__[0].cell_contents)
# print(f.__closure__[0].cell_contents)

# def func(n):
# def inner():
# print(n)
# return inner
# name = '太白'
# f = func(name)
# print(f.__closure__[0].cell_contents) #??? /\ f = func(name)

# def func(n):
# n = name
# def inner():
# print(n)
# return inner
# name = '太白'
# f = func(name)
# print(f.__closure__[0].cell_contents)

#閉包有什麼用???
# def func(step):
# num = 1
# num += step
# print(num)
# j = 0
# while j < 5:
# func(3)
# j +=1 ##每次結果一樣
#閉包:直譯器執行程式時,如果遇到函式,隨著函式的結束而關閉臨時名稱空間,但是!!!
#如果遇到閉包,有一個機制:那麼閉包的空間不會隨著函式的結束而關閉
# def wrapper(step): ###執行過程???
# num = 1
# def inner():
# nonlocal num
# num += step
# print(num)
# return inner
# f = wrapper(3)
# j = 0
# while j < 5:
# j += 1
# f() #等同於inner()

#閉包的應用:
#1 裝飾器
#2 爬蟲

#05 迭代器
#iterable:可迭代物件:
#str list tuple set dic range() 檔案控制代碼
# for i in 'abcd':
# print(i)

# for i in 123:
# print(i)#報錯:TypeError: 'int' object is not iterable

#可迭代物件:內部含有__iter__方法的就是可迭代物件,遵循可迭代協議
s1 = 'barry'
# l1 = [1,2,3]
# print(dir(s1))#列出s1包含的所有方法

#判斷一個物件是否是可迭代物件,迭代器
#方法一:
# print('__iter__' in dir(s1))
# print('__iter__' in dir(range(10)))

#可迭代物件不能直接取值

#迭代器:內部含有'__iter__'並且含有'__next__'方法的就是迭代器,遵循迭代器協議

#可迭代物件轉化成迭代器:
# 可迭代物件.__iter__()或者iter(可迭代物件)
# obj = s1.__iter__()

# s1 = 'abcd'
# obj = iter(s1)
# print(obj)
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
#逐個取出迭代器裡的元素,一個next對應一個值,一一對應
# print(dir(obj))
# print('__iter__' in dir(obj) and '__next__' in dir(obj))

#方法二:
# from collections import Iterable
# from collections import Iterator
# s1 = 'abcd'
# obj = iter(s1)
# print(isinstance(obj,Iterable))
# print(isinstance(obj,Iterator))

# type()與isinstance()的區別:
#type()只是判斷該物件的資料型別
#isinstance()不僅可以判斷該物件的資料型別,而且可以判斷其他很多
from collections import Iterable
from collections import Iterator
# s1 = 'abcd'
# print(isinstance(s1,str))
# print(type(s1))

# 迭代器的作用:
# 1,節省記憶體.
# 2,惰性機制.
# 3, 一條路走到黑,不走回頭路.
# s2 = [1, 2, 3, 4, 5]
# obj2 = iter(s2)
# print(next(obj2))
# print(next(obj2))

# 練習
# 判斷一個物件是否是可迭代物件,迭代器
# str list tuple set dict range() 檔案控制代碼
# f = open('file',encoding='utf-8',mode='w')
# print(isinstance(f,Iterator))

# s2 = [1, 2, 3]
# # 將s2轉化成迭代器 進行取值
# obj2 = iter(s2)
# # print(obj2.__next__())
# print(next(obj2))

#while 迴圈模擬 for 迴圈機制
# l1 = [i for i in range(20)]
# s1 = 'fsdhjkafjdsfalkdjsflksd;f'
# obj = iter(s1)
# while 1:
# try:
# print(next(obj))
# except StopIteration:
# break