第五課:改變函數(shù)參數(shù)的值
一個python函數(shù)可以有任意多個參數(shù),在一個函數(shù)的外部來定義變量,然后把變量作為參數(shù)傳入到函數(shù)內(nèi),并且在函數(shù)的內(nèi)部來修改函數(shù)的參數(shù)值,函數(shù)結(jié)束之后,這些變量的值在如何變化呢?
給函數(shù)傳遞值有2種:1種是值傳遞,1種是引用傳遞
# 改變函數(shù)參數(shù)的值
# 值傳遞(數(shù)值、字符串、布爾 這些都是值傳遞) 在函數(shù)的內(nèi)部修改變量值,不改變原參數(shù)定義的參數(shù)值,解釋為: 這個在函數(shù)中不會改變原來定義(函數(shù)外部)的值 這是因為函數(shù)里面會有一個占的概念,外邊的變量的值會復(fù)制給 占 里面,對于 函數(shù)中的變量來說 并不是指的是同一個變量 在函數(shù)里修改的參數(shù)的變量的值其實是修改了函數(shù)的一個副本,和外邊的參數(shù)沒有直接關(guān)系
# 引用傳遞(復(fù)合類型,列表、字典、以后要講的對象) 在函數(shù)的內(nèi)部修改變量值,將會改變原參數(shù)定義的參數(shù)值, 具體的解釋為: 這個在函數(shù)中會改變原來定義(函數(shù)外部)的值 這里的引用和c語言的指針比較類似
x = 100
s = 'hello world'
def test1(xx,ss): # 將這2個變量變成參數(shù)傳給 函數(shù)test1
xx = 200
ss = 'I love you.'
test1(x,s) # 這一步是講外邊的定義的變量傳給函數(shù)
print(x, s) # 結(jié)果為 100 hello world 值沒有變化 還是和外邊定義的變量值是一樣的 這是因為 x s 都是值傳遞
-------
復(fù)雜的類型
numList = [1,2,3,4,5]
numDict = {'a':1, 'b':2, 'c':3}
a = numList
a[1] = 4
print(numList) # [1, 4, 3, 4, 5] 這一步是將numList的引用復(fù)制了一份給了a 那么這樣的numList 和 a 他們的引用(指針) 指向同一個地址空間,如果我們修改了a的值numList的值也就被修改了 這里的變量是存儲了列表和字典的引用 ;其實光看這個引用的話,其實就是把這個列表和字典的引用傳給函數(shù)中的值 在函數(shù)體內(nèi),所用的內(nèi)存空間和外部的是一樣的,所以值就會根據(jù)函數(shù)體內(nèi)的值的改變而改變。
def test2(nl,nd):
nl[2] = 1234
nd['c'] = 4321
test2(numList, numDict) # 函數(shù)傳參
print(numList) # [1, 4, 1234, 4, 5]
print(numDict) # {'a': 1, 'b': 2, 'c': 4321}
# 我們發(fā)現(xiàn)這里的輸出的值,改變了原先定義的列表和字典 這里叫做 引用傳遞
輸出的結(jié)果為:
100 hello world // 這個結(jié)果和原來定義的沒變
[1, 4, 3, 4, 5] // 這里類似于 引用 (指針),值是會改變的
[1, 4, 1234, 4, 5]
{'a': 1, 'b': 2, 'c': 4321}
-------------------------------------------------------------------
第六課:改變函數(shù)參數(shù)的值(案例) // 這個例子很牛逼
在 控制臺輸入一些數(shù)據(jù),以逗號分隔的字符串 , 然后把這些數(shù)據(jù)轉(zhuǎn)化為字典或者序列
# 從控制臺輸入一些數(shù)據(jù)(以逗號分隔的字符串),然后保存到一個大的字典中 首先先用普通的方法實現(xiàn),然后將一部分的代碼抽象處理,然后再用函數(shù)去實現(xiàn) 我們就是用復(fù)合類型的數(shù)據(jù),將字典傳入函數(shù),然后在函數(shù)的內(nèi)部 修改字典的值,當(dāng)函數(shù)結(jié)束的時候,保留在函數(shù)內(nèi)部修改的效果
data = {} # 首先定義個字典
data['d'] = {} # d的放在字典
data['names'] = [] # names放在列表中
print('請輸入字典數(shù)據(jù),key和value之間用逗號分隔') # 從控制臺輸入
dictStr = input(':') # 從控制臺輸入
# 比如:我們輸入
# a,b,c,d
# {'a':'b','c':'d'}
list = dictStr.split(',') # 利用逗號進行分割
keys =[] # key 和 value 都取出來, 奇數(shù)的Wie key 偶數(shù)為 values
values =[]
for i in range(len(list)):
if i % 2 == 0:
keys.append(list[i])
else:
values.append(list[i])
print(keys) # ['a', 'b', 'c']
print(values) # ['1', '2', '3']
for values in zip(keys,values): # 將第一個列表的第一個元組值轉(zhuǎn)化為 元組
print(values)
'''
('a', '1')
('b', '2')
('c', '3')
'''
輸出的結(jié)果為:
請輸入字典數(shù)據(jù),key和value之間用逗號分隔
:a,1,b,2,c,3
['a', 'b', 'c']
['1', '2', '3']
('a', '1')
('b', '2')
('c', '3')
-----------------------------
第二種方法:
data = {}
data['d'] = {}
data['names'] = []
print('請輸入字典數(shù)據(jù),key和value之間用逗號分隔')
dictStr = input(':')
# a,b,c,d
# {'a':'b','c':'d'}
list = dictStr.split(',') # 分隔符為 ,
keys =[]
values =[]
for i in range(len(list)):
if i % 2 == 0: # 偶數(shù) 分割 true為 key false為 values
keys.append(list[i])
else:
values.append(list[i])
data['d'].update(dict(zip(keys,values))) # 這一步的意思是 把元組轉(zhuǎn)化為字典 更新到d這個字典后面
print('請輸入姓名,多個姓名之間用逗號分隔')
nameStr = input(':')
names = nameStr.split(',')
data['names'].extend(names) # 把另外一個列表追加到一個列表的后面
print(data)
輸出的結(jié)果為:
請輸入字典數(shù)據(jù),key和value之間用逗號分隔
:a,1,b,2,c,3
請輸入姓名,多個姓名之間用逗號分隔
:majihui,zhaoshun
{'d': {'a': '1', 'b': '2', 'c': '3'}, 'names': ['majihui', 'zhaoshun']}
如果我們有多個data這樣的字典,難道我們的代碼要復(fù)制10份嗎,下面引入 函數(shù) :我們把代碼進行抽象,放在一個函數(shù)里面 對重復(fù)使用的代碼。
第三種方法:函數(shù)的方法
# 從控制臺輸入一些數(shù)據(jù)(以逗號分隔的字符串),然后保存到一個大的字典中
# 1. 初始化字典data
# 2. 從控制臺輸入以逗號分隔的字符串,并將其轉(zhuǎn)換為列表或字典
# 3. 輸出字典data
# 1. 初始化字典data
def init(data):
data['d'] = {}
data['names'] = []
# 2. 從控制臺輸入以逗號分隔的字符串,并將其轉(zhuǎn)換為列表或字典
# True:轉(zhuǎn)換為列表,F(xiàn)alse:轉(zhuǎn)換為字典
def inputListOrDict(flag,msg):
print(msg)
inputStr = input(':')
list = inputStr.split(',')
# 直接返回列表
if flag:
return list
keys =[]
values =[]
result = {}
for i in range(len(list)):
if i % 2 == 0:
keys.append(list[i])
else:
values.append(list[i])
return dict(zip(keys,values))
# 3. 輸出字典data
def outDict(data):
for key in data.keys():
print(key, ':', data[key])
// 把上面這3個 函數(shù) 封裝成一個模塊 dataman 我們要維護代碼的話,就只需要維護下面這幾個 就可以了
from dataman import *
data1 = {}
data2 = {}
init(data1)
init(data2)
data1['d'].update(inputListOrDict(False, '請輸入字典數(shù)據(jù)'))
data1['names'].extend(inputListOrDict(True, '請輸入列表數(shù)據(jù)'))
data2['d'].update(inputListOrDict(False, '請輸入字典數(shù)據(jù)'))
data2['names'].extend(inputListOrDict(True, '請輸入列表數(shù)據(jù)'))
outDict(data1)
outDict(data2)
--------------------------------------------------------
課程七:函數(shù)中關(guān)鍵字參數(shù)和參數(shù)默認值
# 關(guān)鍵字參數(shù)和參數(shù)默認值
# 位置參數(shù) 中 形參 值參
# 混合使用位置參數(shù)和關(guān)鍵字參數(shù) 需要注意點
# 1. 關(guān)鍵字參數(shù)必須跟在位置參數(shù)后面
# 2. 同一個形參不能同時使用位置參數(shù)和關(guān)鍵字參數(shù)賦值
# 函數(shù)參數(shù)默認值,如果一個參數(shù)有默認值,那么該參數(shù)后面的所有的參數(shù)必須都有默認值,否則會拋出異常
def greet(name, greeting): # 函數(shù)里面有參數(shù) 一個參數(shù)叫name 一個參數(shù)叫 greeting 這2個叫形參
return '問候語:{} 姓名:{}'.format(greeting, name)
print(greet('李寧', 'Hello')) # 問候語:Hello 姓名:李寧 這里的 Hello 李寧 就表示的值參
print(greet('Hello', '李寧')) # 問候語:李寧 姓名:Hello
# 解決參數(shù)的調(diào)用方式,解決參數(shù)的代碼的語言 通俗的講 就是解決調(diào)用的參數(shù)的時候,能一下子讓人看的懂
# 關(guān)鍵字參數(shù) 可以不按照形參的輸入順序 本講的主要內(nèi)容
print(greet(name='李寧',greeting='Hello')) # 關(guān)鍵字的參數(shù)就是形參的名字 在函數(shù)的內(nèi)部和外部都可以使用,內(nèi)部就是形參 外部就是一個變量
print(greet(greeting = 'Hello', name='李寧'))
print(greet('Bill', greeting='Hello')) # 關(guān)鍵字參數(shù)和位置參數(shù)混合使用 生產(chǎn)上建議用關(guān)鍵字參數(shù),讓人一看代碼就明白
# print(greet(name='Mike', 'Hello')) # 這個會報錯 不行 為什么呢?
# 混合使用位置參數(shù)和關(guān)鍵字參數(shù) 需要注意點
# 1. 關(guān)鍵字參數(shù)必須跟在位置參數(shù)后面
# 2. 同一個形參不能同時使用位置參數(shù)和關(guān)鍵字參數(shù)賦值
# print(greet('Bill', name='Hello'))
def fun(a,b,c = 123,d=4,e=12,f =20,g=40): # 函數(shù)參數(shù)默認值,如果一個參數(shù)有默認值,那么該參數(shù)后面的所有的參數(shù)必須都有默認值,否則會拋出異常
print(a,b,c,d,e,f,g)
fun(1,2,3,4,5) # 1 2 3 4 5 20 40
----------------------------------------------------------------------
第八課:函數(shù)中可變參數(shù)
// 什么是可變參數(shù)?
任意傳輸參數(shù)值是可變的,傳輸?shù)膮?shù)的個數(shù)是不定的 可變參數(shù)的可變是表示參數(shù)的個數(shù)是可以變化的
如何在一個函數(shù)中,定義可變參數(shù)
# 可變參數(shù)
# print(1,2,3,4,5,7,'a')
# 可變參數(shù)在函數(shù)內(nèi)部的表現(xiàn)形式是一個元組
# 一般情況下,可變參數(shù)需要放在普通參數(shù)后面
# 如果可變參數(shù)后面還有普通參數(shù),如果普通參數(shù)沒有默認值,為普通參數(shù)傳值
# 必須要使用關(guān)鍵字參數(shù)形式,如果有默認值,可以不傳值
def printParams(*params): # 在函數(shù)中定義一個可變參數(shù),需要在 參數(shù)的前面加一個* 就成為 可變參數(shù)
print(params)
printParams("hello", 1,True) # ('hello', 1, True) 表現(xiàn)形式是一個元組 這里面的參數(shù)可以隨便的調(diào)整,
def printParams1(*params):
for param in params: # 對每一個元組進行了for循環(huán)的迭代
print('<' + str(param) + '>', end = ' ') # 需要提前轉(zhuǎn)化為字符串 因為有可以輸入的是數(shù)值,數(shù)值不可以和字符串直接相加
printParams1('hello',1,2,3,False,40.1) # <hello> <1> <2> <3> <False> <40.1> 我們得到了每一個值
print()
def printParams2(value, *params): # 一般情況下,把可變參數(shù)放到 普通參數(shù)后面 也有不一般的情況下 后面講
print('[' + str(value) + ']')
for param in params:
print('<' + str(param) + '>', end = ' ')
printParams2('hello',1,2,3,4)
# [hello]
# <1> <2> <3> <4>
#def printParams3(value1, *params, value2 = 20, value3=30): 解決方法1 在定義函數(shù)的時候加上默認值
def printParams3(value1, *params, value2, value3):
print('[' + str(value1) + ']')
print('[' + str(value2) + ']')
print('[' + str(value3) + ']')
for param in params:
print('<' + str(param) + '>', end = ' ')
printParams3('hello',1,2,3,4,5,value2 = 100, value3 = 200) # 解決方法2 在輸出的時候,加上關(guān)鍵字參數(shù)
--------------------------------------------------------------------
第九課:將序列中的元素值作為函數(shù)對應(yīng)的參數(shù)值傳遞
# 將序列作為函數(shù)的參數(shù)值 并不是將一個序列看成一個整體,傳入函數(shù)的一個參數(shù);而是將這個序列拆開,將每一個序列的元數(shù)值作為一個單獨的參數(shù)傳入函數(shù)的參數(shù)。
def printParams1(s1, s2):
print(s1, s2)
printParams1("Hello", "World")
strList = ['Hello', 'World']
printParams1(*strList) # 把列表前面加一個* 就會把列表中的參數(shù)的值拆開 到函數(shù)的每一個參數(shù)中 最后的值為: Hello World
def printParams2(*ss): # 定義成可變參數(shù),也是可以的
for s in ss:
print('<{}>'.format(s), end = ' ')
printParams2(*strList) # <Hello> <World>
print()
printParams2(*'abcdefg') # <a> <b> <c> <d> <e> <f> <g> 直接傳值
print()
printParams2(*[1,2,3,4,5,6]) # <1> <2> <3> <4> <5> <6> 他會自動的把列表的值拆開 作為可變參數(shù)傳入
def printParams3(**ss): # 如何我們傳入字典呢? 傳入字典需要2 個 **
for item in ss.items(): # 這里用 items 方法輸入 key value
print(item) # 變量輸出 表現(xiàn)形式為 元組
print('{} = {}'.format(item[0], item[1]))
dict = {'a':10, 'b':20,'c':30}
printParams3(**dict)
printParams3(**{'name':'Bill','age':20})
'''
a = 10
('b', 20)
b = 20
('c', 30)
c = 30
('name', 'Bill')
name = Bill
('age', 20)
age = 20
'''
# 這個是不加2個** 和加2個** 是沒有本質(zhì)的區(qū)別的 我操
def printParams4(ss):
for item in ss.items():
print(item)
print('{} = {}'.format(item[0], item[1]))
dict = {'a':10, 'b':20,'c':30}
printParams4(dict)
printParams4({'name':'Bill','age':20})
注意:
為函數(shù)傳遞可變參數(shù)值(單星和雙星參數(shù))
單星和雙星 參數(shù) : 都是作為擴展參數(shù)用的 區(qū)別是什么呢?
*a # 導(dǎo)入元組和列表的
**a # 導(dǎo)入字典的
def f1(a1,*a2):
print(a1)
print(a2)
f1(1,2,3,4,5)
輸出結(jié)果
1
(2, 3, 4, 5)
def f2(a1,**a2):
print(a1)
print(a2)
f2(1,aaa=111,bbb=222)
輸出的結(jié)果為:
1
{'aaa': 111, 'bbb': 222}
#就會自動的把后面關(guān)鍵字參數(shù)轉(zhuǎn)化為字典輸出
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
創(chuàng)新互聯(lián)公司致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,包括網(wǎng)站建設(shè)、成都網(wǎng)站制作、SEO優(yōu)化、網(wǎng)絡(luò)推廣、整站優(yōu)化營銷策劃推廣、電子商務(wù)、移動互聯(lián)網(wǎng)營銷等。創(chuàng)新互聯(lián)公司為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制及解決方案,創(chuàng)新互聯(lián)公司核心團隊10多年專注互聯(lián)網(wǎng)開發(fā),積累了豐富的網(wǎng)站經(jīng)驗,為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設(shè)服務(wù),在網(wǎng)站建設(shè)行業(yè)內(nèi)樹立了良好口碑。
當(dāng)前名稱:38py改變函數(shù)參數(shù)的值關(guān)鍵字參數(shù)和參數(shù)默認值函數(shù)中可變參-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://jinyejixie.com/article14/djesde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、外貿(mào)建站、關(guān)鍵詞優(yōu)化、用戶體驗、外貿(mào)網(wǎng)站建設(shè)、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容