一、元組
1泉哈、元組的定義:
元組, 英文為 **tuple**蛉幸, Python的元組與列表類似,不同之處在于**元組的元素不能修改**丛晦。元組使用小括號(hào)奕纫,列表使用方括號(hào)。元組創(chuàng)建很簡單烫沙,只需要在括號(hào)中添加元素匹层,并使用逗號(hào)隔開即可。my_tuple = ('et', 77, 99.9, True)
2锌蓄、訪問元組元素
my_tuple = ('et', 77, 99.9, True)
print(my_tuple[0])
3升筏、修改元組,元組不可以修改瘸爽,會(huì)報(bào)錯(cuò)
my_tuple[0] = 'hello' —— 報(bào)錯(cuò)
4您访、 獲取元素索引值和數(shù)量
count, index:index和count與字符串和列表中的用法相同
a = ('a', 'b', 'c', 'a', 'b')
ret1 = a.index('a', 1, 3)? # 注意是左閉右開區(qū)間,會(huì)報(bào)錯(cuò)剪决,因?yàn)樵娴?:3位沒有a
ret2 = a.index('a', 1, 4)
ret3 = a.count('b')
ret4 = a.count('d')
# 元組和列表相比: 列表是可變的, 元組是不可變的
# 定義一個(gè)空元組
my_tuple = ()
print(type(my_tuple))
# 特例:
# 如果元組中只有一個(gè)元素
# 如下寫法是錯(cuò)誤的:? <class 'int'>
my_tuple2 = (1)
print(type(my_tuple2))
# 如下寫法才是正確的:? <class 'tuple'>
my_tuple3 = (1,)
print(type(my_tuple3))
# 元組也可以通過下標(biāo)獲取元組中的元素
my_tuple4 = (1, 3.14, True, 'Hello')
# 獲取3.14
value = my_tuple4[1]
print(value)
# 因?yàn)樵M是不可改變的 不可以修改元素 或者刪除元素
# 我們是否可以根據(jù)index和count獲取某個(gè)元素的位置和個(gè)數(shù)
index = my_tuple4.index(3.14)
print(index)
# 獲取某個(gè)元素的個(gè)數(shù)
count = my_tuple4.count(3.14)
print(count)
# for循環(huán)遍歷:
for value in my_tuple4:
? ? print(value)
# while循環(huán)遍歷:
index = 0
length = len(my_tuple4)
while index < length:
? ? value = my_tuple4[index]
? ? print(value)
? ? index += 1
二灵汪、字典
python中的字典規(guī)定則是 一對一:my_dict = {'name':'班長'}
字典是另一種可變?nèi)萜髂P停铱纱鎯?chǔ)任意類型對象昼捍。字典的每個(gè)鍵值 key? =>? value對? 用冒號(hào) : 分割识虚;每個(gè)鍵值對之間用逗號(hào) , 分割;整個(gè)字典包括在花括號(hào) {} 中 ,格式如下所示:
字典的格式:d = {key1 : value1, key2 : value2, ... }
說明:
- 字典和列表一樣妒茬,也能夠存儲(chǔ)多個(gè)數(shù)據(jù), 且數(shù)據(jù)類型沒有要求
- 列表中找某個(gè)元素時(shí)担锤,是根據(jù)下標(biāo)進(jìn)行的
- 字典中找某個(gè)元素時(shí),是根據(jù)'名字'(就是冒號(hào):前面的那個(gè)值乍钻,例如上面代碼中的'name')
- 字典的每個(gè)元素由2部分組成肛循,鍵:值铭腕。例如 'name':'班長' ,'name'為鍵,'班長'為值
1多糠、根據(jù)鍵--->訪問值
my_dict = {'name':'班長', 'id':100, 'sex':'f', 'address':'地球亞洲中國北京'}
my_dict['name']
**需要注意**::若訪問不存在的鍵累舷,則會(huì)報(bào)錯(cuò)
在我們不確定字典中是否存在某個(gè)鍵而又想獲取其值時(shí),可以使用get方法夹孔,還可以設(shè)置默認(rèn)值:
my_dict = {'name': '班長'}
age = my_dict.get('age') #使用get方法,如果沒有當(dāng)前的key,則返回None
print(age)結(jié)果:
None我們也可以設(shè)置一個(gè)默認(rèn)值,如果沒有當(dāng)前的key值時(shí),? 則返回默認(rèn)參數(shù):
my_dict = {'name': '班長'}
age = my_dict.get('age','age值沒有')
print(age)結(jié)果:
age值沒有# 三個(gè)元素(鍵值對) 被盈,則len()返回3
print(len(my_dict))#定義一個(gè)特殊 (空字典)
my_dict1 = {}
print(len(my_dict1))
# <class 'dict'>
print(type(my_dict1))
my_dict2 = dict()
print(type(my_dict2))
# 鍵值1: 實(shí)值1 統(tǒng)稱為 鍵值對 key value 也稱之為元素
# 鍵值數(shù)據(jù)類型的選擇: 必須是不可變的
# 鍵值 的名字不能重復(fù)(才能完成1對1 通過一個(gè)key 獲取key 的value),value可以重復(fù)
# 字典的key 一般都是使用字符串
# 字典的value 沒有規(guī)定 (可以重復(fù)的)
2搭伤、 字典的常用操作01:
1)? 修改元素
> 字典的每個(gè)元素中的數(shù)據(jù)是可以修改的只怎,只要通過key找到,即可修改怜俐,# 字典是無序的 可變的
my_dict = {'name':'班長', 'id':100, 'sex':'f', 'address':'地球亞洲中國北京'}
new_id = input('請輸入新的學(xué)號(hào):')
my_dict['id'] = int(new_id)
print('修改之后的id為: %d' % my_dict['id'])
?2) 添加元素
> 我們在修改一個(gè)字典時(shí), 如果當(dāng)前的key值不存在, 不會(huì)報(bào)錯(cuò), 而是進(jìn)行了增加,? 會(huì)在原有的字典中再次增加一個(gè).
my_dict[key] = value
# 如果使用上面的格式 如果這個(gè)key不存在 添加一組鍵值對
#如果使用上面的格式 如果這個(gè)key存在 會(huì)吧key原來的value的值進(jìn)行覆蓋
例如:
my_dict = {'name':'meihao'}
my_dict['age1'] = 101
print(my_dict)
3)? 刪除元素
> 對字典進(jìn)行刪除操作身堡,有一下幾種:
del刪除指定的元素:# 刪除鍵值對 格式: del 字典名[key]
my_dict = {'name':'班長', 'sex':'f', 'address':'地球亞洲中國北京'}
print('刪除前: %s' % my_dict['name'])
del my_dict['name']
print('刪除后: %s' % my_dict['name']) ——報(bào)錯(cuò)
clear清空整個(gè)字典,my_dict.clear()? ?等價(jià)于 my_dict = {} 或者 my_dict = dict()
my_dict = {'name':'monitor', 'sex':'f', 'address':'China'}
print('清空前: %s' % my_dict)
my_dict.clear()
print('清空后: %s' % my_dict)
結(jié)果:
清空前: {'name': 'monitor', 'sex': 'f', 'address': 'China'}
清空后: {}
3拍鲤、字典的常用操作02:
1)? len(o)贴谎,o代表object,對象?
> 該方法為python內(nèi)置方法,可以返回傳入對象的長度
dict = {'name': 'zhangsan', 'sex': 'm'}
length = len(dict)
print(length)
結(jié)果: 2
2)? keys(self) 季稳,self代表沒有參數(shù)
> 返回一個(gè)包含字典所有key值的列表方法,? 我們可以把該方法轉(zhuǎn)為列表
例如:
my_dict = {'name':'monitor', 'sex':'f', 'address':'China'}
keys = my_dict.keys()
print(keys)
結(jié)果:dict_keys(['name', 'sex', 'address']) ——?# dict_keys(['name', 'sex', 'address'])其實(shí)就是列表類型 dict_keys
把該方法轉(zhuǎn)為列表:
my_dict = {'name':'monitor', 'sex':'f', 'address':'China'}
keys1 = list(my_dict.keys())
print(keys1)
結(jié)果:['name', 'sex', 'address']
3)? values(self)
>? 返回一個(gè)包含字典所有value的列表方法, 該列表方法可以轉(zhuǎn)換為列表
例如:
my_dict = {'name': 'zhangsan', 'sex': 'm'}
values = my_dict.values()
print(values)
結(jié)果:dict_values(['zhangsan', 'm'])
將列表方法轉(zhuǎn)化為列表:
my_dict = {'name': 'zhangsan', 'sex': 'm'}
values1 = list(my_dict.values())
print(values1)
結(jié)果:['zhangsan', 'm']
4)? items(self)
> 返回一個(gè)列表,該列表由元組組成,元組又是由key ---> value的鍵值對組成
例如:?最外層是一個(gè)列表 每個(gè)元素是一個(gè)元組 (元素1(key), 元素2(value))
my_dict = {'name': 'zhangsan', 'sex': 'm'}
items = my_dict.items()
print(items)
items1 = list(items)
print(items1)
結(jié)果:dict_items([('name', 'zhangsan'), ('sex', 'm')])擅这,[('name', 'zhangsan'), ('sex', 'm')]
5)? 字典的遍歷
> 通過for ... in ...
> 我們可以遍歷字符串、列表绞幌、元組蕾哟、字典等(**注意python語法的縮進(jìn)**)
# 定義一個(gè)字典:my_dict = {"name": "小紅", "age": 22, "no": "009"}
# 遍歷-key
for key in my_dict.keys():
????print(key)# 遍歷value
for value in my_dict.values():
????print(value)# 遍歷items
for item in my_dict.items():
????print(item[0])
????print(item[1])# 通過設(shè)置兩個(gè)臨時(shí)變量
for key, value in my_dict.items():
????print("key:", key)
????print("value:", value)
### 可以獲取索引值的遍歷形式:
# 如果想使用元素和下標(biāo)索引 請使用enumerate(列表名)
# 定義一個(gè)列表
my_list = list("abcd")
# 不僅要獲取列表中的元素 而且需要知道這個(gè)元素下標(biāo)索引
for i, value in enumerate(my_list):
? ? print(i,value)
print('---------------------')
my_tuple = ('1234')
for i, value in enumerate(my_tuple):
? ? print(i,value)
print('----------------------')
my_dict = {'name':'meihao','age':'12345'}
for i, item in enumerate(my_dict.items()):
? ? print(i, item)
print('----------------------')
my_dict = {'name':'meihao','age':'12345'}
for i, key in enumerate(my_dict.keys()):
? ? print(i, key)
print('----------------------')
my_dict = {'name':'meihao','age':'12345'}
for i, value in enumerate(my_dict.values()):
? ? print(i, value)
print('----------------------')
三、公共方法和總結(jié)
1莲蜘、關(guān)于開閉區(qū)間的總結(jié)
1)隨機(jī)數(shù)
# 取值范圍: [x,? y]
random.randint(x, y)?
2)范圍
# 取值范圍 [x, y)
range(x, y)
3)切片 --->? 字符串中谭确,列表,元組也可以切片
# 取值范圍[x, y)
'a'[x: y: 步長]
2票渠、數(shù)據(jù)類型是否可變:
不可變的:int? float? bool? str? 元組
可變的:列表? 字典
3逐哈、公共方法
運(yùn)算符
| 運(yùn)算符 | Python 表達(dá)式? ? ? | 結(jié)果? ? ? ? ? ? ? ? ? ? ? ? | 描述? ? ? ? ? | 支持的數(shù)據(jù)類型? ? ? ? ? |
| +? ? ? ? ? | [1, 2] + [3, 4]? ? ? ? ?| [1, 2, 3, 4]? ? ? ? ? ? ? ? | 合并? ? ? ? ? | 字符串、列表问顷、元組? ? ? |
| *? ? ? ? ? ?| ['Hi!'] * 4? ? ? ? ? ? ? ? | ['Hi!', 'Hi!', 'Hi!', 'Hi!'] | 復(fù)制? ? ? ? ? | 字符串昂秃、列表、元組? ? ? |
| in? ? ? ? ?| 3 in (1, 2, 3)? ? ? ? ? ?| True? ? ? ? ? ? ? ? ? ? ? ? | 元素是否存在? | 字符串杜窄、列表肠骆、元組、字典 |
| not in? ?| 4 not in (1, 2, 3)? ? ?| True? ? ? ? ? ? ? ? ? ? ? ? | 元素是否不存在 | 字符串塞耕、列表蚀腿、元組、字典 |
4、python內(nèi)置函數(shù)
| 序號(hào) | 方法? ? ? | 描述? ? ? ? ? ? ? ? |
| 1? ? | len(item) | 計(jì)算容器中元素個(gè)數(shù)? |
| 2? ? | max(item) | 返回容器中元素最大值 |
| 3? ? | min(item) | 返回容器中元素最小值 |
| 4? ? | del(item) | 刪除變量? ? ? ? ? ? |
> **注意:len在操作字典數(shù)據(jù)時(shí)莉钙,返回的是鍵值對個(gè)數(shù)廓脆。**
max1 = max("hello itcast")? —— 結(jié)果是t,字母表里t這里最大
max3 = max({"a":1, "b":2}) —— 結(jié)果是b磁玉,對比的是鍵的大小停忿,字母表里b比a大
max4 = max({"a":10, "b":2})—— 結(jié)果是b,對比的是鍵的大小 蚊伞,字母表里b比a大
max5 = max({"c":10, "b":12})—— 結(jié)果是c席赂,對比的是鍵的大小 ,字母表里c比b大
> del有兩種用法时迫,一種是del加空格氧枣,另一種是del()
a = 1
del aa = ['a', 'b']
del a[0]a = ['a', 'b']
del(a)
# 列表
# 注意順序
# my_list1 = [1, 2]
# my_list2 = [3, 5]
# ret1 = my_list2 + my_list1
# 字符串
# name = "小明"
# 占位符
# print("我叫%s" % name)
# ret = "我叫" + name
# ret1 = "我叫%s" % name
# print(ret1)
# 類型不統(tǒng)一 使用str()轉(zhuǎn)類型
# name = "小明"
# age = 18
# ret2 = "我叫" + name + "年齡" + str(age)
# print(ret2)
# 元組
# ret3 = (1, 4) + (6, 9)
# print(ret3)
# 運(yùn)算符 *
# 字符串
# my_str = "=="*20
# print(my_str)
# 列表
# my_list = ["hello", "world"]*10
# print(my_list)
# 元組
# my_tuple = (11,)*5
# print(my_tuple)
# in
#字符串
# my_name = "world"
# if "l" in my_name:
#? ? print("存在")
# 元組
# my_tuple = (1, 3, 5)
# if 1 in my_tuple:
#? ? print("存在")
# 字典
# my_dict = {"name": "小紅", "age": 22, "no": "009"}
# 使用in 在字典中其實(shí)是判斷的是key存不存在
# if "name" in my_dict:
#? ? print("存在")
# 就是想查看值到底有沒有
# if "小紅" in my_dict.values():
#? ? print("存在")
# del用法總結(jié)
# 可以配合列表使用
# my_list = [1, 2, 3]
# del my_list[1]
# 可以配合字典
# my_dict = {"name": "小紅", "age": 22, "no": "009"}
# del my_dict["age"]
# 可以提前銷毀一個(gè)對象
# 在程序沒有結(jié)束的時(shí)候 程序員提前殺死了這個(gè)對象 提前釋放內(nèi)存
# num = 10
# del num
# print(num)
# NameError: name 'num' is not defined
# 監(jiān)聽當(dāng)程序結(jié)束后 python會(huì)執(zhí)行一個(gè)方法 del num 告知系統(tǒng)回收內(nèi)存
## 練習(xí)1:- 統(tǒng)計(jì)字符串中,各個(gè)字符的個(gè)數(shù)- 比如:"hello world"
# 字符串統(tǒng)計(jì)的結(jié)果為: h:1 e:1 l:3 o:2 d:1 r:1 w:1str = 'hello world'
my_list = []
for c in str:
? ? if c != ' ' and c not in my_list:
? ? ? ? my_list.append(c)
? ? ? ? count = str.count(c)
? ? ? ? print('%s:%d' % (c,count),end=")
四别垮、函數(shù)
1. 函數(shù)的了解,所有面向?qū)ο蟮恼Z言都有三大特點(diǎn):封裝,繼承扎谎,多態(tài)
>? 函數(shù)是組織好的碳想,可重復(fù)使用的,用來實(shí)現(xiàn)單一毁靶,或相關(guān)聯(lián)功能的代碼段胧奔。
> 函數(shù)的好處: 函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率预吆。你已經(jīng)知道Python提供了許多內(nèi)建函數(shù)龙填,比如print()。但你也可以自己創(chuàng)建函數(shù)拐叉,這被叫做用戶自定義函數(shù)岩遗。
針對經(jīng)常重復(fù)使用,且代碼段很長的程序,我們可以使用函數(shù)將代碼段進(jìn)行封裝, 哪里需要,直接調(diào)用封裝好的函數(shù)名即可,不用重復(fù)寫代碼.
* 函數(shù)的出現(xiàn)解決了多次重復(fù)書寫某一部分代碼的問題
* 函數(shù)往往是某個(gè)功能的集合
* 這里的函數(shù)不要和我們數(shù)學(xué)中的函數(shù)聯(lián)系起來.
* 函數(shù)就是個(gè)代碼塊.具有對立的功能.也可以理解為一個(gè)對象.
2、 函數(shù)的定義和調(diào)用
1) 定義函數(shù)
函數(shù)定義的簡單規(guī)則:
- 函數(shù)代碼塊以 **def** 關(guān)鍵詞開頭凤瘦,后接函數(shù)標(biāo)識(shí)符名稱和小括號(hào) **()**宿礁。
- 函數(shù)內(nèi)容以冒號(hào)開始,并且必須要縮進(jìn)蔬芥。
一般格式如下:
def 函數(shù)名():
函數(shù)體
2) 調(diào)用函數(shù)
> 定義了函數(shù)之后梆靖,就相當(dāng)于有了一個(gè)具有某些功能的代碼,想要讓這些代碼能夠執(zhí)行笔诵,需要調(diào)用它
> 調(diào)用函數(shù)很簡單返吻,通過 **函數(shù)名()** 即可完成調(diào)用
- 每次調(diào)用某個(gè)函數(shù)時(shí),該函數(shù)體都會(huì)從頭開始執(zhí)行
- 當(dāng)這個(gè)函數(shù)中的代碼執(zhí)行完畢后乎婿,意味著調(diào)用結(jié)束
- 函數(shù)的定義一定要在函數(shù)調(diào)用之前.否則會(huì)找不到函數(shù)
3测僵、函數(shù)的文檔說明
> 給函數(shù)添加一些注釋, 解釋說明當(dāng)前函數(shù)的主要功能, 參數(shù)作用, 返回值情況.
給函數(shù)添加文檔說明:
def 函數(shù)名(a, b):
????"""
????這里可以書寫該函數(shù)的主要作用
? ? :param a: 第一個(gè)參數(shù)介紹
? ? :param b: 第二個(gè)參數(shù)介紹
????:return:? 返回值的介紹
????"""
如果我們使用python內(nèi)置函數(shù)help() 就可以發(fā)現(xiàn)剛剛定義的函數(shù)文檔內(nèi)容了.? help(func_name) ——? 里面的函數(shù)名不能加小括號(hào),因?yàn)檫@里不是要調(diào)用函數(shù)
4次酌、函數(shù)參數(shù)一:
> 定義一般函數(shù)的時(shí)候我們可能用不到函數(shù)的參數(shù),? 但是有些問題需要外部給內(nèi)部的函數(shù)傳值, 就需要函數(shù)能夠接受參數(shù)
> 讓函數(shù)能夠接收參數(shù)是對函數(shù)進(jìn)行的擴(kuò)展.
定義一個(gè)帶有參數(shù)的函數(shù),格式如下:
def 函數(shù)名(參數(shù)1, 參數(shù)2, ...):
????函數(shù)體
# 調(diào)用帶有參數(shù)的函數(shù)時(shí)恨课,需要在小括號(hào)中舆乔,傳遞數(shù)據(jù)
#add2num是一個(gè)自定義函數(shù)
add2num(11, 22)
5、函數(shù)的返回值
“返回值”: 就是程序中的函數(shù)執(zhí)行完成后剂公,返回回來的數(shù)據(jù).
* 其中:? 一個(gè)函數(shù)可以有返回值也可以沒有返回值,這個(gè)要看業(yè)務(wù)需求
* 返回值可以是多種多樣的,? 任何類型都有可能
* 函數(shù)返回?cái)?shù)據(jù)的時(shí)候用的關(guān)鍵字是? return
* 函數(shù)調(diào)用后,如果有返回值, 我們可以定義一個(gè)變量來進(jìn)行接收.
# 定義一個(gè)帶有返回值的函數(shù)
def func():
????print('你好,這里是函數(shù)內(nèi)部')
????return '函數(shù)調(diào)用完成'
也可以寫成這樣:
# 定義一個(gè)帶有返回值的函數(shù)
def func(a, b):
????print('你好,這里是函數(shù)內(nèi)部')
????return a + b也可以寫成這樣:
def func():
????print('你好,這里是函數(shù)內(nèi)部')
????return True也可以寫成這樣: (下面的代碼是函數(shù)的遞歸調(diào)用)
def deep(num):
?????print(num)
?????if num == 20:
?????????return
?????num += 1
?????return deep(num)
?deep(1)
結(jié)果是什么? 結(jié)果為 1 到 20 的所有數(shù)字# return 當(dāng)成跳出函數(shù)的方式來使用,而不是用它返回內(nèi)容
def func(a):
????if a < 0:
?????????print('請傳入正確的參數(shù).')
?????????return
????return a + 1
總結(jié):
* 函數(shù)可以有返回值,也可以沒有
* 函數(shù)的返回值自定
* 程序讀取到return 關(guān)鍵字后,? 就會(huì)退出當(dāng)前的函數(shù)體, 即 return之后的代碼將不會(huì)執(zhí)行
* 如果return 后面有內(nèi)容, 則返回return后面的內(nèi)容,? 如果單獨(dú)寫一個(gè)return, 即 return后面沒有寫明返回內(nèi)容,則返回None,? 但是函數(shù)體的執(zhí)行到此仍然結(jié)束, 不再往下執(zhí)行.
* 有時(shí)候,我們會(huì)把 return 當(dāng)成跳出當(dāng)前函數(shù)的方式來使用,? 而不是用它返回內(nèi)容.
* 一個(gè)函數(shù)中可以有多個(gè)return語句希俩,但是只要有一個(gè)return語句被執(zhí)行到,那么這個(gè)函數(shù)就會(huì)結(jié)束纲辽,因此后面的return是沒什么用處的
* 一個(gè)函數(shù)中想要同時(shí)返回多個(gè)數(shù)據(jù), 不能夠靠寫多個(gè)return來實(shí)現(xiàn).? 我們可以在函數(shù)的return 后面, 直接返回一個(gè)元組, 列表 或者 字典等.
如果return后面想要返回元組, 可以不用加 ( ) python返回多個(gè)值時(shí), 默認(rèn)就是元組格式:
def func():
? ??return 1, 2, 3?result = func()
print(result)
print(type(result))(1, 2, 3)
<class 'tuple'>
6. 四種類型的函數(shù)
1)? 無參數(shù)颜武,無返回值的函數(shù)
此類函數(shù),不能接收參數(shù)拖吼,也沒有返回值鳞上,一般情況下,打印提示燈類似的功能吊档,使用這類的函數(shù)
2) 無參數(shù)篙议,有返回值的函數(shù)
?此類函數(shù),不能接收參數(shù)怠硼,但是可以返回某個(gè)數(shù)據(jù)鬼贱,一般情況下,像采集數(shù)據(jù)香璃,用此類函數(shù)
3) 有參數(shù)这难,無返回值的函數(shù)
此類函數(shù),能接收參數(shù)葡秒,但不可以返回?cái)?shù)據(jù)姻乓,一般情況下,對某些變量設(shè)置數(shù)據(jù)而不需結(jié)果時(shí)眯牧,用此類函數(shù)
4) 有參數(shù)蹋岩,有返回值的函數(shù)
此類函數(shù),不僅能接收參數(shù)学少,還可以返回某個(gè)數(shù)據(jù)星澳,一般情況下,像數(shù)據(jù)處理并需要結(jié)果的應(yīng)用旱易,用此類函數(shù)
7禁偎、函數(shù)的嵌套使用
def testB():
????print('---- testB start----')
????print('這里是testB函數(shù)執(zhí)行的代碼...(省略)...')
????print('---- testB end----')def testA():
????print('---- testA start----')
????testB()
????print('---- testA end----')testA()
總結(jié):
> 一個(gè)函數(shù)里面又調(diào)用了另外一個(gè)函數(shù),這就是所謂的函數(shù)嵌套調(diào)用
>? 如果函數(shù)A中阀坏,調(diào)用了另外一個(gè)函數(shù)B如暖,那么先把函數(shù)B中的任務(wù)都執(zhí)行完畢之后才會(huì)回到上次 函數(shù)A執(zhí)行的位置
> 一個(gè)函數(shù)中可以嵌套無數(shù)個(gè)函數(shù).
> 函數(shù)可以連著進(jìn)行嵌套,? 即 a函數(shù)嵌套于 b函數(shù), b函數(shù)又嵌套于 c函數(shù), c函數(shù)又.......
8、局部變量
> 函數(shù)內(nèi)部定義的變量,是局部變量忌堂,局部變量的作用域(使用范圍)在函數(shù)的內(nèi)部 函數(shù)的外部無法使用,形參也是局部變量
在函數(shù)內(nèi)部定義的局部變量名可以和其他函數(shù)中的局部變量名相同 是不沖突的
- 局部變量的作用盒至,為了臨時(shí)保存數(shù)據(jù)需要在函數(shù)中定義變量來進(jìn)行存儲(chǔ)
- 當(dāng)函數(shù)調(diào)用時(shí),局部變量被創(chuàng)建,當(dāng)函數(shù)調(diào)用完成后這個(gè)變量就不能夠使用了
9枷遂、全局變量
> 如果一個(gè)變量樱衷,既能在一個(gè)函數(shù)中使用,也能在其他的函數(shù)中使用酒唉,這樣的變量就是全局變量
總結(jié)1:
- 在函數(shù)外邊定義的變量叫做`全局變量`
- 全局變量能夠在所有的函數(shù)中進(jìn)行訪問
相同名字的全局和局部變量
# 定義一個(gè)全局變量
a = 100def func1():
????a = 300
????print('------func1----修改前---a = %d ' %? a)
????a = 200
????print('------func1----修改后---a = %d ' %? a)def func2(): #函數(shù)內(nèi)部的a首先在函數(shù)內(nèi)部找矩桂,如果內(nèi)部沒有,就找函數(shù)外部的a
????print('------func2-----a = %d ' % a)# 調(diào)用函數(shù)
func1()
func2()結(jié)果:
------func1----修改前---a = 300
------func1----修改后---a = 200
------func2-----a = 100總結(jié)2:
- 當(dāng)函數(shù)內(nèi)出現(xiàn)局部變量和全局變量相同名字時(shí)痪伦,函數(shù)內(nèi)部中的 `變量名 = 數(shù)據(jù)` 此時(shí)理解為定義了一個(gè)局部變量侄榴,而不是修改全局變量的值
修改全局變量
>? 函數(shù)中使用全局變量時(shí)可否進(jìn)行修改呢?
# 定義一個(gè)全局變量
a = 100
def func1():
????global a # 把外部的a拿進(jìn)來
????print('------func1----修改前---a = %d ' %? a)
????a = 200
????print('------func1----修改后---a = %d ' %? a)def func2():
????print('------func2-----a = %d ' % a)# 調(diào)用函數(shù)
func1()
func2()結(jié)果:
------func1----修改前---a = 100
------func1----修改后---a = 200
------func2-----a = 200總結(jié)3:
- 如果在函數(shù)中出現(xiàn)`global 全局變量的名字` 那么這個(gè)函數(shù)中即使出現(xiàn)和全局變量名相同的`變量名 = 數(shù)據(jù)` 也理解為對全局變量進(jìn)行修改网沾,而不是定義局部變量
- 如果在一個(gè)函數(shù)中需要對多個(gè)全局變量進(jìn)行修改
# 可以使用一次global對多個(gè)全局變量進(jìn)行聲明
global a, b
# 還可以用多次global聲明都是可以的
global a
global b
10癞蚕、函數(shù)參數(shù)(二)
1)? 位置參數(shù)
> 位置參數(shù)是指我們調(diào)用函數(shù)時(shí)傳入的函數(shù)值和定義函數(shù)時(shí)的參數(shù)是一一對應(yīng)的.
# 定義一個(gè)函數(shù)
def my_func1(a, b):
? ? print(a + b)
# 函數(shù)的調(diào)用 -> 位置參數(shù)調(diào)用函數(shù)
# 使用位置參數(shù)調(diào)用函數(shù) 需要注意實(shí)參的位置
# 實(shí)參的位置和形參的位置要一一對應(yīng)
# TypeError: my_func1() missing 1 required positional argument: 'b'
# 如果實(shí)參傳入的少一個(gè)實(shí)參 會(huì)報(bào)錯(cuò)
2)? 關(guān)鍵字參數(shù)
> 我們調(diào)用函數(shù)的時(shí)候可以指定要傳遞的參數(shù)名稱, 直接把實(shí)參傳遞給對應(yīng)的形參.
# 通過指定形參名字的形式,把實(shí)參直接傳遞給對應(yīng)的形參.
def func(a, b):
????result = a + b
????print(result)# 可以這樣調(diào)用關(guān)鍵字參數(shù)
func(a = 10, b = 20)# 或者這樣:
func(b = 20, a = 10)結(jié)果:
30
30
def my_print(name, age, no):
????print("我的名字:%s" % name)
????print("我的年齡:%d" % age)
????print("學(xué)號(hào):%s" % no)# 調(diào)用-> 位置參數(shù):my_print("小明", 20)
# 調(diào)用函數(shù)的時(shí)候使用的是函數(shù)的形參名: my_print(age=22, name="老王")
# 調(diào)用函數(shù)的時(shí)候 使用了位置和關(guān)鍵字參數(shù)混合
# 如果混合使用 需要叫位置參數(shù)在前 關(guān)鍵字參數(shù)再后
# 如果某個(gè)參數(shù)使用了關(guān)鍵字參數(shù) 后面的都需要使用關(guān)鍵字參數(shù):my_print("小明", age=20, no="007")
3) 缺省參數(shù)
> 缺省參數(shù)就是指的默認(rèn)值參數(shù), 即如果我們調(diào)用函數(shù)的時(shí)候沒有傳入該參數(shù), 那么就直接使用該缺省參數(shù).
總結(jié):
- 在形參中默認(rèn)有值的參數(shù),稱之為缺省參數(shù)
- 注意:帶有默認(rèn)值的參數(shù)一定要位于參數(shù)列表的最后面, 否則報(bào)錯(cuò)
# 如果執(zhí)行函數(shù)的時(shí)候提供實(shí)參 那么函數(shù)的形參使用實(shí)參
# 如果執(zhí)行函數(shù)的時(shí)候沒有提供實(shí)參 那么形參將使用默認(rèn)值(缺省參數(shù))
# 在定義函數(shù)的時(shí)候某個(gè)形參使用了缺省參數(shù) 那么后面的形參 都需要用缺省參數(shù)
def my_print(name, age=20, no="001")
4)? 函數(shù)返回多個(gè)數(shù)據(jù)的方式
# 列表
def deal_name_age(name, age):
?????# 處理后 姓名:小明? 年齡:22
????new_name = "姓名:%s" % name
????new_age = "年齡:%d" % age
????return [new_name, new_age]# 變量為列表
ret = deal_name_age("小明", 22)
print(ret[0])
print(ret[1])# 字典
def deal_name_age(name, age):
????# 處理后 姓名:小明? 年齡:22
????new_name = "姓名:%s" % name
????new_age = "年齡:%d" % age
????return {"name":new_name, "age":new_age}my_dict = deal_name_age("小明", 22)
print(my_dict["name"])
print(my_dict["age"])# 元組
def deal_name_age(name, age):
????# 處理后 姓名:小明? 年齡:22
????new_name = "姓名:%s" % name
????new_age = "年齡:%d" % age
????# 如果在函數(shù)內(nèi)部 使用return 返回值1 返回值2,... 默認(rèn)就是元組類型 不需要寫小括號(hào)
????return new_name, new_agemy_tuple = deal_name_age("小明", 22)
print(type(my_tuple))
print(my_tuple[0])
print(my_tuple[1])
11辉哥、拆包
拆包:? 對于函數(shù)中的多個(gè)返回?cái)?shù)據(jù), 去掉元組, 列表 或者字典 直接獲取里面數(shù)據(jù)的過程.
1) 對列表進(jìn)行拆包
my_list = [1, 3.14, "hello", True]
num, pi, my_str, my_bool = my_list# 或者
num, pi, my_str, my_bool = [1, 3.14, "hello", True]
2) 對元組進(jìn)行拆包
my_tuple = (1, 3.14, "hello", True)
num, pi, my_str, my_bool = my_tuple
3) 對字典進(jìn)行拆包
my_dict = {"name":"老王", "age": 19}
ret1, ret2 = my_dict
# 得到的是key? 字典是無序的
4)? 用拆包的形式定義變量
# # 變量名和值是一一對應(yīng)
num1, num2, num3, num4 = 10, 20, 30, 3.14
5)? 函數(shù)返回元組時(shí)直接拆包
對元組拆包:
def get_my_info():
????high = 178
????weight = 100
????age = 18
????return high, weight, age
# 這一步叫做拆包:
my_high, my_weight, my_age = get_my_info()也可以對列表或者元組拆包:
def function1():
????return [1, 2, 3]def function2():
????return {"key1": 1, "key2": 2, "key3": 3}# 調(diào)用函數(shù),獲取里面的數(shù)據(jù)
num1, num2, num3 = function1()
print(num1, num2, num3)
總結(jié):
- 拆包時(shí)要注意桦山,需要拆的數(shù)據(jù)的個(gè)數(shù)要與變量的個(gè)數(shù)相同,否則程序會(huì)異常
- 除了對元組拆包之外醋旦,還可以對列表度苔、字典等拆包
- 對字典拆包后獲取的是字典的key值, 而不是value值
交換兩個(gè)變量的值:a = 1,? b = 2.? ? ? 怎樣把 a,? b 的值交換?
### 1)? 方法一:> 定義一個(gè)變量c
a = 1
b = 2
c = 0
c = a
a = b
b = c### 2) 方法二:> 加法運(yùn)算:
a = 1
b = 2
a = a + b
b = a - b
a = a - b?### 3) 方法三:> 異或運(yùn)算,異或運(yùn)算只能在二進(jìn)制時(shí)進(jìn)行浑度,不能對十進(jìn)制進(jìn)行
# 異或運(yùn)算就是相同的值得0,不同的值得1鸦概,如 1111 XOR 0101=1010箩张。
# 兩個(gè)二進(jìn)制數(shù)進(jìn)行邏輯或運(yùn)算時(shí),要是有一個(gè)為1窗市,則結(jié)果為1先慷,只有兩個(gè)數(shù)全為0結(jié)果才為0 ,如 1010 OR 1101=1111
a = 1? #十進(jìn)制的1是二進(jìn)制的1咨察,因?yàn)榉?進(jìn)1的話论熙,還沒到2
b = 2 #十進(jìn)制的2是二進(jìn)制的10
a = a ^ b
b = a ^ b? # a^b = a^b^b=a^0=a
a = a ^ b? # a^b = a^a^b = 0^b = b### 4) 方法四:> 拆包
a = 1
b = 2
a, b = b, a### 5) 方法五:
a = 1
b = 2
if a > b:
? ? num = a-b
? ? a -= num
? ? b += num
else:
? ? num = b-a
? ? a += num
? ? b -= num
五、匿名函數(shù)
> 用lambda關(guān)鍵詞能創(chuàng)建小型匿名函數(shù)摄狱。這種函數(shù)省略了用def聲明函數(shù)的標(biāo)準(zhǔn)步驟脓诡。
> lambda表達(dá)式,通常是在**需要一個(gè)函數(shù)媒役,但是又不想費(fèi)神去命名一個(gè)函數(shù)**的場合下使用祝谚,也就是指**匿名函數(shù)**。
lambda函數(shù)的語法只包含一個(gè)語句酣衷,如下:
lambda [arg1 [,arg2,.....argn]]:expression
例如:
sum = lambda arg1, arg2: arg1 + arg2 —— arg1交惯,arg2是形參# 調(diào)用sum函數(shù)
print("Value of total : %d" % sum( 10, 20 ))
print("Value of total : %d"% sum( 20, 20 ))
應(yīng)用場合
1)? 函數(shù)作為參數(shù)傳遞
例如:
def func(a, b, opt)
????print('a:%d' % a)
????print('b:%d' % b)
????print('result:%d' % opt(a, b))func(1, 2, lambda x, y : x + y)
結(jié)果:
a:1
b:2
result:3
2)? 作為內(nèi)置函數(shù)的參數(shù)
list = [
????{"name": "zhangsan", "age": 18},
????{"name": "lisi", "age": 19},
????{"name": "wangwu", "age": 17}
????]
# key:可選參數(shù), 如果指定了該參數(shù)會(huì)使用該參數(shù)的方法進(jìn)行排序。
list.sort(key = lambda x: x['name'])
print(list)
list.sort(key= lambda x: x['age'])
print(list)按name排序:
[{'name': 'lisi', 'age': 19}, {'name': 'wangwu', 'age': 17}, {'name': 'zhangsan', 'age': 18}]按 age 排序:
[{'name': 'wangwu', 'age': 17}, {'name': 'zhangsan', 'age': 18}, {'name': 'lisi', 'age': 19}]add = lambda x, y : x+y
add(1,2)? # 結(jié)果為3def func(a,b):
????return lambda x:ax+b
f = func(1,1)
f(1) # 結(jié)果為2
總結(jié):
* lambda函數(shù)也叫匿名函數(shù), 即? 函數(shù)沒有具體的名稱.
* lambda? x, y : x + y 中:? lambda是關(guān)鍵字.? x, y 是函數(shù)的兩個(gè)形參.? ? x + y是函數(shù)的返回值.
? * 上面的式子可以寫成:
? * def? func( x,? y ):? ? return x + y
* 匿名函數(shù)的可以作為參數(shù), 傳遞到另一個(gè)函數(shù)中.
def first(x, y):
????return? x + y
def second(x, y, opt):
????print(x)
????print(y)
????result = opt(x, y)
????print(result)
second(22, 33, first)
* 上面的代碼可以用匿名函數(shù)實(shí)現(xiàn):
def second(x, y, opt):
????print(x)
????print(y)
????result = opt(x, y)
????print(result)
second(22, 33, lambda x, y: x + y)