Python函數的作用域及內置函數詳解
1.函數的作用域
— 內置
— 全局,頂格寫
— 局部,函數內部
a = 34 #全局變量 def run(): b = 44 #局部變量 print(a) print(b) #不可以直接調用局部變量,報錯
運行結果:
c = 12 def run(a): print(a) b = 33 run(5) # 一個全局變量c # 兩個局部變量a,b # 函數的參數也是局部變量
運行結果:
5
局部 VS 全局
— 局部空間(函數內)獲取全局變量,Yes
— 全部空間(函數外)獲取局部變量,No,但可以間接通過返回值 return 獲取
— 全局空間(函數外)修改局部變量,No
— 局部空間(函數內)修改全部變量,Yes,但必須要聲明,global 全局變量名
siwei = 99 def run(): print('函數執行') print(siwei)# 調用全局變量,可以正常使用 run()
運行結果:
函數執行
99
siwei = 99 def run(): print('函數執行') a = 88 print(siwei)# 調用全局變量,可以正常使用 return a #用返回值,返給全局變量result result = run() print(result)
運行結果:
函數執行
99
88
siwei = 99 def run(): print('函數執行') a = 88 print(siwei)# 調用全局變量,可以正常使用 return a #用返回值,返給全局變量result result = run() print(result)
運行結果:
100
2.函數的調用詳解
註意:
— 函數必須先定義再調用
— 不同函數定義的先後順序無關
— 函數體內可以調用函數自己本身,但一般不這樣使用,容易出錯
# 還沒定義函數就直接調用,所以會報錯 offer('lili',20,'辣條') def eat(name,food): print('{} 最喜歡吃 {}'.format(name,food)) def offer(name,money,food): print('恭喜 {} 拿到 {}k offer'.format(name,money)) eat(name,food)
運行結果:
# 一個函數當中是可以去調用另外一個函數的 def eat(name,food): print('{} 最喜歡吃 {}'.format(name,food)) def offer(name,money,food): print('恭喜 {} 拿到 {}k offer'.format(name,money)) eat(name,food) offer('lili',20,'辣條')
運行結果:
恭喜 lili 拿到 20k offer
lili 最喜歡吃 辣條
# 兩個函數位置互換是不影響結果的 def offer(name,money,food): print('恭喜 {} 拿到 {}k offer'.format(name,money)) eat(name,food) def eat(name,food): print('{} 最喜歡吃 {}'.format(name,food)) offer('lili',20,'辣條')
運行結果:
恭喜 lili 拿到 20k offer
lili 最喜歡吃 辣條
可以通過Debug模式來詳細查看一下代碼的運行過程
offer 和 eat 函數第一行被執行,函數體裡的代碼不會被執行
當offer 被調用時,代碼自動找offer函數,然後進入函數體內,然後執行eat 函數
代碼自動找eat 函數,然後進入函數體
# 函數自己可以調用自己本身,但會報遞歸錯誤 def run(): print('正在運行!') run() run()
運行結果:
RecursionError: maximum recursion depth exceeded while calling a Python object
遞歸錯誤:調用Python對象時超過的最大遞歸深度
3.內置函數
enumrate():獲取列表的索引值與元素值
list1 = ['a','b',1,2] for i in enumerate(list1): # 輸入結果是數據類型是元組 print(i) for index,value in enumerate(list1): # 輸出結果:索引值是int類型,元素值是什麼數據類型就是什麼類型 print(index,value)
運行結果:
(0, ‘a’) ====> tuple
(1, ‘b’)
(2, 1)
(3, 2)
0 a ====> 0 int a str
1 b
2 1====> 2 int 1 int
3 2
eval():去掉字符串兩邊的引號
string = '1 + 1' string1 = '7.8 + 4.5' string2 = '(1,2,3)' print(string,type(string)) # 去掉引號,相當於變成瞭算數運算 print(eval(string),type(eval(string))) print(eval(string1),type(eval(string1))) # 去掉引號,相當於變成瞭元組 print(eval(string2),type(eval(string2)))
運行結果:
1 + 1 <class ‘str’>
2 <class ‘int’>
12.3 <class ‘float’>
(1, 2, 3) <class ‘tuple’>
zip():用於將可迭代的對象作為參數,按索引號打包成一組一組
title = ['id','name','url'] row = ['1','lili','http://www.baidu1.com'] # zip迭代每一個元素,按索引號打包成一組,然後通過dict轉換成字典 result = dict(zip(title,row)) print(result) # 列表,元組都可以轉換成字典 title1 = ('id','name','url') row1 = ['2','lili','http://www.baidu2.com'] result1 =dict(zip(title1,row1)) print(result1)
運行結果:
{‘id’: ‘1’, ‘name’: ‘lili’, ‘url’: ‘http://www.baidu1.com’}
{‘id’: ‘2’, ‘name’: ‘lili’, ‘url’: ‘http://www.baidu2.com’}
a = [1,2,3] b = ('a','b','c') c = 'qaz' result = dict(zip(a,c)) result1 = dict(zip(a,b)) result2 = dict(zip(b,c)) print(result) print(result1) print(result2)
運行結果:
{1: ‘q’, 2: ‘a’, 3: ‘z’}
{1: ‘a’, 2: ‘b’, 3: ‘c’}
{‘a’: ‘q’, ‘b’: ‘a’, ‘c’: ‘z’}
sum(iterable[, start]):求和,求和的類型必須是數字
terable – 可迭代對象,如:列表(list)、元組(tuple)、集合(set)、字典(dict)
start – 指定相加的參數,如果沒有設置這個值,默認為0
所以 sum(1,2,3) 是錯誤的,sum(必須是可迭代對象)
list1 = [2,3,4] tuple1 = (1,1,1) dict1= {60.5:'chinese',70:'math'} set1 = {1,2,3} print(sum(list1,1))#列表中2,3,4 加上start的值1 print(sum(tuple1))#元組中1,1,1加上默認start的值0 print(sum(dict1))#字典中相加的是key的值,key若不是數字會報錯 print(sum(set1))#集合裡必須是一層,不能嵌套其他層
運行結果:
10
3
130.5
6
max()
:求最大值
min()
:求最小值
list1 = [1,2,3] print(max(list1)) print(max(3,4,5)) print(min(list1)) print(min(4,5,6))
運行結果:
3
5
1
4
id()
:查看內存地址
a = 10 b = 10 # 不可變類型(字符串,元組等),內存地址一樣 print(id(a)) print(id(b)) # 可變類型(列表,字典),內存地址不一樣 c = [1,2,3] d = [1,2,3] print(id(c)) print(id(d))
運行結果:
140716744443840
140716744443840
1975790732416
1975791019584
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- python變量作用域與列表入門詳解
- Python基礎 括號()[]{}的詳解
- Python中的變量、運算符與流程控制
- Python eval() 函數看這一篇就夠瞭
- Python中str.format()方法的具體使用