一、函數名的應用 函數名的定義和變數的定義幾乎一致,在變數的角度,函數名其實就是一個變數,具有變數的功能:可以賦值;但是作為函數名他也有特殊的功能就是加上()就會執行對應的函數,所以我們可以把函數名當做一個特殊的變數 1、函數名指向的是函數的記憶體地址 函數名 + ()就可以執行次函數 def ...
一、函數名的應用
函數名的定義和變數的定義幾乎一致,在變數的角度,函數名其實就是一個變數,具有變數的功能:可以賦值;但是作為函數名他也有特殊的功能就是加上()就會執行對應的函數,所以我們可以把函數名當做一個特殊的變數
1、函數名指向的是函數的記憶體地址
函數名 + ()就可以執行次函數
def func():
print("呵呵")
print(func)
輸出結果:
<function func at 0x1101e4ea0>
通過上面代碼可以我們知道,函數名指向的是這個函數的記憶體地址,其實深一步理解可得知,與其說函數名()可以執行這個函數,不如說是函數的記憶體地址()才是執行這個函數的關鍵,就好比:
a = 1
b = 2
c = a + b
print(c) # 3
2、函數名可以賦值給其他變數
def func():
print("呵呵")
print(func)
a = func # 把函數當成一個變量賦值給另一個變量
a() # 函數調用 func()
3、函數名可以當容器類元素
def func1():
print("in func1: 嘻嘻")
def func2():
print("in func2: 哈哈")
def func3():
print("in func3: 咯咯")
def func4():
print("in func4: 吱吱")
lst = [func1, func2, func3, func4]
for i in lst:
i()
4、函數名可以當做函數的參數
def func1():
print('in func1')
def func2(f):
print('in func2')
f()
func2(func1)
輸出結果:
in func2
in func1
5、函數名可以作為函數的返回值
def func1():
print('in func1')
def func2(f):
print('in func2')
return f
ret = func2(func1)
ret()
輸出結果:
in func2
in func1
二、Python新特性:f-strings格式化輸出
1、舊的格式化輸出方式
name = 'mrxiong'
age = 19
msg = '我叫%s,今年%s'%(name,age)
msg1 = '我叫{},今年{}'.format(name,age)
print(msg)
print(msg1)
2、新特性:格式化輸出 python3.6版本後適用
name = 'mrxiong'
age = 19
msg = f'我叫{name},今年{age}'
print(msg)
可以加表達式
dic={'name':'mrxiong','age':19}
msg = f'我叫{dic["name"]},今年{dic["age"]}'
print(msg)
count= 7
a = f'最終結果:{count*7}'
print(a)
name= 'mrxiong'
msg1= f'我的名字是 :{name.upper()}'
print(msg1)
結合函數 使用
def _sum(a,b):
return a+b
msg2 = f'最終的計算結果是:{_sum(10,20)}'
print(msg2)
def _sum(a,b):
return a+b
num=int(input('請輸入弟一個數字:'))
num1=int(input('請輸入第二個數字:'))
msg2 = f'最終的計算結果是:{_sum(num,num1)}'
print(msg2)
優點:1、結構更清晰更簡化,2、可以結合表達式及函數進行使用,3、效率提升很多
三、迭代器
1、可迭代對象
字面意思:對像,python中一切皆對象,一個實實在在存在的值,對象
可迭代:更新迭代。 重覆的,迴圈的一個過程。可進行迴圈更新的一個實實在在值
專業角度:可迭代對像,內部含有’____iter‘_方法的對像,可迭代對像
目前學過的可迭代對象:str list tuple dict set range 文件句柄
判斷一個對像的所有方法:dir()
s1 = 'mrxiong'
print(dir(s1))
s1 = 'mrxiong'
print('__iter__'in dir(s1))
- 小結
- 字面意思:可以進行迴圈更新的一個實實在在值
- 專業角度:可迭代對像,內部含有’____iter‘_方法的對像,可迭代對象
- 判斷一個對像是不是可迭代對像:’____iter‘ in dir(對像)
- str list tuple dict set range 文件句柄
- 優點:
- 存儲的數據直接能顯示,比較直觀
- 擁有的方法比較多
- 缺點:
- 占用記憶體
- 不能直接通過for迴圈,不能直接取值(索引,key)
2、迭代器
-
迭代器的定義:
- 字面意思:更新迭代,器:工具,可更新迭代的工具
- 專業角度:內部含有'_____iter' 方法並且含有 '_____next' 方法的對象就是迭代器
- 可以判斷是否是迭代器:'inter'and '_____next' 在不在dir(對象)
- 判斷一個對象是否是迭代器
with open('a.txt', encoding='utf-8', mode='w') as f1:
print('__iter__' in dir(f1) and '__next__' in dir(f1))
- 可迭代對象如何轉化成迭代器並取值
s1 = 'adf'
obj = iter(s1) #把s1轉換為一個迭代器
obj.__iter__() #把s1轉換為一個迭代器第二種方法
print(next(obj)) #next對己轉換的迭代器進行取值
print(obj.__next__()) #next對己轉換的迭代器進行取值第二種方法
print(next(obj))
l1 = [11,22,33,44,55,66]
l2 = iter(l1)
print(next(l2))
print(next(l2))
print(next(l2))
print(next(l2))
print(next(l2))
print(next(l2))
l3 = iter([1,2,3,4])
print(next(l3))
print(next(l3))
print(next(l3))
print(next(l3))
可迭代對象轉換成迭代器
iter([1,2,3])
利用while迴圈模擬for迴圈對可迭代對象進行取值的機制
s1 = [11, 22, 33, 44, 55, 66, 77, 88]
obj = iter(s1)
while 1:
try:
print(next(obj))
except StopIteration:
break
-
小結
- 迭代器優點:
1)節省記憶體。迭代器在記憶體中相當於只占一個數據的空間:因為每次取值都上一條數據會在記憶體釋放,載入當前的此條數據。
2) 惰性機制。next一次,取一個值,絕不過多取值。
有一個迭代器模式可以很好的解釋上面這兩條:迭代是數據處理的基石。掃描記憶體中放不下的數據集時,我們要找到一種惰性獲取數據項的方式,即按需一次獲取一個數據項。這就是迭代器模式。
- 迭代器的缺點:
不能直觀的查看裡面的數據。
取值時不走回頭路,只能一直向下取值。
速度慢
-
可迭代對象與迭代器的對比
- 可迭代對象:
是一個私有的方法比較多,操作靈活(比如列表,字典的增刪改查,字元串的常用操作方法等),比較直觀,但是占用記憶體,而且不能直接通過迴圈迭代取值的這麼一個數據集。
應用:當你側重於對於數據可以靈活處理,並且記憶體空間足夠,將數據集設置為可迭代對象是明確的選擇。
- 迭代器:
是一個非常節省記憶體,可以記錄取值位置,可以直接通過迴圈+next方法取值,但是不直觀,操作方法比較單一的數據集。
**應用**:當你的數據量過大,大到足以撐爆你的記憶體或者你以節省記憶體為首選因素時,將數據集設置為迭代器是一個不錯的選擇。(可參考為什麼python把文件句柄設置成迭代器)。