38py改變函數(shù)參數(shù)的值關(guān)鍵字參數(shù)和參數(shù)默認(rèn)值函數(shù)中可變參-創(chuàng)新互聯(lián)

第五課:改變函數(shù)參數(shù)的值
一個(gè)python函數(shù)可以有任意多個(gè)參數(shù),在一個(gè)函數(shù)的外部來(lái)定義變量,然后把變量作為參數(shù)傳入到函數(shù)內(nèi),并且在函數(shù)的內(nèi)部來(lái)修改函數(shù)的參數(shù)值,函數(shù)結(jié)束之后,這些變量的值在如何變化呢?
給函數(shù)傳遞值有2種:1種是值傳遞,1種是引用傳遞 

# 改變函數(shù)參數(shù)的值
# 值傳遞(數(shù)值、字符串、布爾 這些都是值傳遞) 在函數(shù)的內(nèi)部修改變量值,不改變?cè)瓍?shù)定義的參數(shù)值,解釋為: 這個(gè)在函數(shù)中不會(huì)改變?cè)瓉?lái)定義(函數(shù)外部)的值   這是因?yàn)楹瘮?shù)里面會(huì)有一個(gè)占的概念,外邊的變量的值會(huì)復(fù)制給 占 里面,對(duì)于 函數(shù)中的變量來(lái)說(shuō) 并不是指的是同一個(gè)變量 在函數(shù)里修改的參數(shù)的變量的值其實(shí)是修改了函數(shù)的一個(gè)副本,和外邊的參數(shù)沒(méi)有直接關(guān)系 
# 引用傳遞(復(fù)合類型,列表、字典、以后要講的對(duì)象)  在函數(shù)的內(nèi)部修改變量值,將會(huì)改變?cè)瓍?shù)定義的參數(shù)值, 具體的解釋為: 這個(gè)在函數(shù)中會(huì)改變?cè)瓉?lái)定義(函數(shù)外部)的值 這里的引用和c語(yǔ)言的指針比較類似 
x = 100
s = 'hello world'
def test1(xx,ss):     # 將這2個(gè)變量變成參數(shù)傳給 函數(shù)test1 
    xx = 200
    ss = 'I love you.'
test1(x,s)            # 這一步是講外邊的定義的變量傳給函數(shù)    
print(x, s)             # 結(jié)果為  100 hello world 值沒(méi)有變化 還是和外邊定義的變量值是一樣的 這是因?yàn)?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 他們的引用(指針) 指向同一個(gè)地址空間,如果我們修改了a的值numList的值也就被修改了 這里的變量是存儲(chǔ)了列表和字典的引用 ;其實(shí)光看這個(gè)引用的話,其實(shí)就是把這個(gè)列表和字典的引用傳給函數(shù)中的值 在函數(shù)體內(nèi),所用的內(nèi)存空間和外部的是一樣的,所以值就會(huì)根據(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     // 這個(gè)結(jié)果和原來(lái)定義的沒(méi)變   
[1, 4, 3, 4, 5]     // 這里類似于 引用 (指針),值是會(huì)改變的 
[1, 4, 1234, 4, 5]
{'a': 1, 'b': 2, 'c': 4321}

-------------------------------------------------------------------
第六課:改變函數(shù)參數(shù)的值(案例)  // 這個(gè)例子很牛逼 
在 控制臺(tái)輸入一些數(shù)據(jù),以逗號(hào)分隔的字符串 , 然后把這些數(shù)據(jù)轉(zhuǎn)化為字典或者序列 
# 從控制臺(tái)輸入一些數(shù)據(jù)(以逗號(hào)分隔的字符串),然后保存到一個(gè)大的字典中     首先先用普通的方法實(shí)現(xiàn),然后將一部分的代碼抽象處理,然后再用函數(shù)去實(shí)現(xiàn)  我們就是用復(fù)合類型的數(shù)據(jù),將字典傳入函數(shù),然后在函數(shù)的內(nèi)部 修改字典的值,當(dāng)函數(shù)結(jié)束的時(shí)候,保留在函數(shù)內(nèi)部修改的效果 

data = {}                   # 首先定義個(gè)字典
data['d'] = {}              # d的放在字典
data['names'] = []          # names放在列表中 
print('請(qǐng)輸入字典數(shù)據(jù),key和value之間用逗號(hào)分隔')    # 從控制臺(tái)輸入 
dictStr = input(':')                            # 從控制臺(tái)輸入
# 比如:我們輸入
# a,b,c,d
# {'a':'b','c':'d'}
list = dictStr.split(',')      # 利用逗號(hào)進(jìn)行分割 
keys =[]                            # key 和 value 都取出來(lái), 奇數(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):       #  將第一個(gè)列表的第一個(gè)元組值轉(zhuǎn)化為 元組 
    print(values)
'''
('a', '1')
('b', '2')
('c', '3')
'''

輸出的結(jié)果為:
請(qǐng)輸入字典數(shù)據(jù),key和value之間用逗號(hào)分隔
:a,1,b,2,c,3
['a', 'b', 'c']
['1', '2', '3']
('a', '1')
('b', '2')
('c', '3')
----------------------------- 
第二種方法:
data = {}
data['d'] = {}
data['names'] = []
print('請(qǐng)輸入字典數(shù)據(jù),key和value之間用逗號(hào)分隔')
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這個(gè)字典后面  

print('請(qǐng)輸入姓名,多個(gè)姓名之間用逗號(hào)分隔')
nameStr = input(':')
names = nameStr.split(',')
data['names'].extend(names)      # 把另外一個(gè)列表追加到一個(gè)列表的后面 

print(data)

輸出的結(jié)果為:
請(qǐng)輸入字典數(shù)據(jù),key和value之間用逗號(hào)分隔
:a,1,b,2,c,3
請(qǐng)輸入姓名,多個(gè)姓名之間用逗號(hào)分隔
:majihui,zhaoshun
{'d': {'a': '1', 'b': '2', 'c': '3'}, 'names': ['majihui', 'zhaoshun']} 

如果我們有多個(gè)data這樣的字典,難道我們的代碼要復(fù)制10份嗎,下面引入 函數(shù) :我們把代碼進(jìn)行抽象,放在一個(gè)函數(shù)里面 對(duì)重復(fù)使用的代碼。

第三種方法:函數(shù)的方法 
# 從控制臺(tái)輸入一些數(shù)據(jù)(以逗號(hào)分隔的字符串),然后保存到一個(gè)大的字典中
#  1.  初始化字典data
#  2.  從控制臺(tái)輸入以逗號(hào)分隔的字符串,并將其轉(zhuǎn)換為列表或字典
#  3.  輸出字典data

# 1.  初始化字典data
def init(data):
    data['d'] = {}
    data['names'] = []
# 2.  從控制臺(tái)輸入以逗號(hào)分隔的字符串,并將其轉(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個(gè) 函數(shù) 封裝成一個(gè)模塊 dataman 我們要維護(hù)代碼的話,就只需要維護(hù)下面這幾個(gè) 就可以了 
from dataman import *

data1 = {}
data2 = {}
init(data1)
init(data2)

data1['d'].update(inputListOrDict(False, '請(qǐng)輸入字典數(shù)據(jù)'))
data1['names'].extend(inputListOrDict(True, '請(qǐng)輸入列表數(shù)據(jù)'))

data2['d'].update(inputListOrDict(False, '請(qǐng)輸入字典數(shù)據(jù)'))
data2['names'].extend(inputListOrDict(True, '請(qǐng)輸入列表數(shù)據(jù)'))

outDict(data1)
outDict(data2)

--------------------------------------------------------
課程七:函數(shù)中關(guān)鍵字參數(shù)和參數(shù)默認(rèn)值
# 關(guān)鍵字參數(shù)和參數(shù)默認(rèn)值 

# 位置參數(shù)    中 形參   值參      

# 混合使用位置參數(shù)和關(guān)鍵字參數(shù) 需要注意點(diǎn)
# 1. 關(guān)鍵字參數(shù)必須跟在位置參數(shù)后面
# 2. 同一個(gè)形參不能同時(shí)使用位置參數(shù)和關(guān)鍵字參數(shù)賦值

# 函數(shù)參數(shù)默認(rèn)值,如果一個(gè)參數(shù)有默認(rèn)值,那么該參數(shù)后面的所有的參數(shù)必須都有默認(rèn)值,否則會(huì)拋出異常
def greet(name, greeting):                  # 函數(shù)里面有參數(shù) 一個(gè)參數(shù)叫name  一個(gè)參數(shù)叫 greeting   這2個(gè)叫形參 
    return '問(wèn)候語(yǔ):{}  姓名:{}'.format(greeting, name) 

print(greet('李寧', 'Hello'))    #  問(wèn)候語(yǔ):Hello  姓名:李寧       這里的 Hello 李寧 就表示的值參
print(greet('Hello', '李寧'))   # 問(wèn)候語(yǔ):李寧  姓名:Hello

# 解決參數(shù)的調(diào)用方式,解決參數(shù)的代碼的語(yǔ)言 通俗的講 就是解決調(diào)用的參數(shù)的時(shí)候,能一下子讓人看的懂 
# 關(guān)鍵字參數(shù) 可以不按照形參的輸入順序   本講的主要內(nèi)容  

print(greet(name='李寧',greeting='Hello'))        # 關(guān)鍵字的參數(shù)就是形參的名字  在函數(shù)的內(nèi)部和外部都可以使用,內(nèi)部就是形參 外部就是一個(gè)變量 
print(greet(greeting = 'Hello', name='李寧'))

print(greet('Bill', greeting='Hello'))      # 關(guān)鍵字參數(shù)和位置參數(shù)混合使用   生產(chǎn)上建議用關(guān)鍵字參數(shù),讓人一看代碼就明白 
# print(greet(name='Mike', 'Hello'))     # 這個(gè)會(huì)報(bào)錯(cuò) 不行 為什么呢?
# 混合使用位置參數(shù)和關(guān)鍵字參數(shù) 需要注意點(diǎn)
# 1. 關(guān)鍵字參數(shù)必須跟在位置參數(shù)后面
# 2. 同一個(gè)形參不能同時(shí)使用位置參數(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ù)默認(rèn)值,如果一個(gè)參數(shù)有默認(rèn)值,那么該參數(shù)后面的所有的參數(shù)必須都有默認(rèn)值,否則會(huì)拋出異常
    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ù)的個(gè)數(shù)是不定的 可變參數(shù)的可變是表示參數(shù)的個(gè)數(shù)是可以變化的 
如何在一個(gè)函數(shù)中,定義可變參數(shù)
# 可變參數(shù)

# print(1,2,3,4,5,7,'a')
# 可變參數(shù)在函數(shù)內(nèi)部的表現(xiàn)形式是一個(gè)元組
# 一般情況下,可變參數(shù)需要放在普通參數(shù)后面
# 如果可變參數(shù)后面還有普通參數(shù),如果普通參數(shù)沒(méi)有默認(rèn)值,為普通參數(shù)傳值
# 必須要使用關(guān)鍵字參數(shù)形式,如果有默認(rèn)值,可以不傳值
def printParams(*params):    # 在函數(shù)中定義一個(gè)可變參數(shù),需要在 參數(shù)的前面加一個(gè)* 就成為 可變參數(shù) 
    print(params)

printParams("hello", 1,True)        # ('hello', 1, True)  表現(xiàn)形式是一個(gè)元組  這里面的參數(shù)可以隨便的調(diào)整,

def printParams1(*params):
    for param in params:                            # 對(duì)每一個(gè)元組進(jìn)行了for循環(huán)的迭代 
        print('<' + str(param) + '>', end = ' ')   # 需要提前轉(zhuǎn)化為字符串 因?yàn)橛锌梢暂斎氲氖菙?shù)值,數(shù)值不可以和字符串直接相加 
printParams1('hello',1,2,3,False,40.1)              # <hello> <1> <2> <3> <False> <40.1>   我們得到了每一個(gè)值

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ù)的時(shí)候加上默認(rèn)值 
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 在輸出的時(shí)候,加上關(guān)鍵字參數(shù)

--------------------------------------------------------------------
第九課:將序列中的元素值作為函數(shù)對(duì)應(yīng)的參數(shù)值傳遞    
# 將序列作為函數(shù)的參數(shù)值  并不是將一個(gè)序列看成一個(gè)整體,傳入函數(shù)的一個(gè)參數(shù);而是將這個(gè)序列拆開(kāi),將每一個(gè)序列的元數(shù)值作為一個(gè)單獨(dú)的參數(shù)傳入函數(shù)的參數(shù)。

def printParams1(s1, s2):
    print(s1, s2)

printParams1("Hello", "World")
strList = ['Hello', 'World'] 
printParams1(*strList)       #  把列表前面加一個(gè)*  就會(huì)把列表中的參數(shù)的值拆開(kāi) 到函數(shù)的每一個(gè)參數(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>     他會(huì)自動(dòng)的把列表的值拆開(kāi) 作為可變參數(shù)傳入 

def printParams3(**ss):          # 如何我們傳入字典呢?   傳入字典需要2 個(gè) ** 
    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 
'''

# 這個(gè)是不加2個(gè)**        和加2個(gè)** 是沒(méi)有本質(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ù) : 都是作為擴(kuò)展參數(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}
#就會(huì)自動(dòng)的把后面關(guān)鍵字參數(shù)轉(zhuǎn)化為字典輸出

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

創(chuàng)新互聯(lián)公司致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營(yíng)銷,包括網(wǎng)站建設(shè)、成都網(wǎng)站制作、SEO優(yōu)化、網(wǎng)絡(luò)推廣、整站優(yōu)化營(yíng)銷策劃推廣、電子商務(wù)、移動(dòng)互聯(lián)網(wǎng)營(yíng)銷等。創(chuàng)新互聯(lián)公司為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制及解決方案,創(chuàng)新互聯(lián)公司核心團(tuán)隊(duì)10多年專注互聯(lián)網(wǎng)開(kāi)發(fā),積累了豐富的網(wǎng)站經(jīng)驗(yàn),為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設(shè)服務(wù),在網(wǎng)站建設(shè)行業(yè)內(nèi)樹(shù)立了良好口碑。

當(dāng)前名稱:38py改變函數(shù)參數(shù)的值關(guān)鍵字參數(shù)和參數(shù)默認(rèn)值函數(shù)中可變參-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://muchs.cn/article14/djesde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航外貿(mào)建站、關(guān)鍵詞優(yōu)化用戶體驗(yàn)、外貿(mào)網(wǎng)站建設(shè)、App開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)