博學(xué)谷第八天

時(shí)間:2020年1月2日
內(nèi)容:函數(shù)提高

函數(shù)提高

變量作用域(重點(diǎn))

  • 局部變量
    函數(shù)內(nèi)部變量叛甫,只在函數(shù)內(nèi)部生效
def testA():
  a = 100

  print(a)

testA() # 100
print(a) # 報(bào)錯(cuò):name 'a' is not defined

變量a是定義在 testA 函數(shù)內(nèi)部的變量羽历,在函數(shù)外部訪問則立即報(bào)錯(cuò)笑陈。
局部變量的作用:在函數(shù)體內(nèi)部,臨時(shí)保存數(shù)據(jù),即當(dāng)函數(shù)調(diào)用完成后孤澎,則銷毀局部變量。

  • 全局變量
    指在函數(shù)體內(nèi)欠窒、外都能生效的變量
# 定義全局變量a
a = 100

def testA():
  print(a)  # 訪問全局變量a覆旭,并打印變量a存儲(chǔ)的數(shù)據(jù)

def testB():
  print(a)  # 訪問全局變量a,并打印變量a存儲(chǔ)的數(shù)據(jù)

testA()  # 100
testB()  # 100
a = 100

def testA():
  print(a)

def testB():
  a = 200
  print(a)

testA()  # 100
testB()  # 200
print(f'全局變量a = {a}')  # 全局變量a = 100
# 函數(shù)體內(nèi)修改全局變量
a = 100

def testA():
  print(a)

def testB():
  # global 關(guān)鍵字聲明a是全局變量
  global a
  a = 200
  print(a)

testA()  # 100
testB()  # 200
print(f'全局變量a = {a}')  # 全局變量a = 200

多函數(shù)程序執(zhí)行流程

一般在實(shí)際開發(fā)過程中岖妄,一個(gè)程序往往由多個(gè)函數(shù)(后面知識(shí)中會(huì)講解類)組成型将,并且多個(gè)函數(shù)共享某些數(shù)據(jù),如下所示:

  • 共用全局變量
# 1. 定義全局變量
glo_num = 0

def test1():
  global glo_num
  # 修改全局變量
  glo_num = 100

def test2():
  # 調(diào)用test1函數(shù)中修改后的全局變量
  print(glo_num)

# 2. 調(diào)用test1函數(shù)荐虐,執(zhí)行函數(shù)內(nèi)部代碼:聲明和修改全局變量
test1()
# 3. 調(diào)用test2函數(shù)七兜,執(zhí)行函數(shù)內(nèi)部代碼:打印
test2()  # 100
  • 返回值作為參數(shù)傳遞
def test1():
  return 50

def test2(num):
  print(num)

# 1. 保存函數(shù)test1的返回值
result = test1()

# 2. 將函數(shù)返回值所在變量作為參數(shù)傳遞到test2函數(shù)
test2(result)  # 50

函數(shù)的返回值(重點(diǎn))

函數(shù)有多個(gè)返回值

def return_num():
  return 1, 2

result = return_num()
print(result)  # (1, 2) 元組

注意:

  1. return a, b 寫法,返回多個(gè)數(shù)據(jù)的時(shí)候福扬,默認(rèn)是元組類型
  2. return后面可以連接列表腕铸、元組或字典惜犀,以返回多個(gè)值。

函數(shù)的參數(shù) (重點(diǎn))

位置參數(shù)

調(diào)用函數(shù)時(shí)根據(jù)函數(shù)定義的參數(shù)位置來傳遞參數(shù)

def user_info(name, age, gender):
  print(f'您的姓名是{name}, 年齡是{age}, 性別是{gender}')

user_info('Tom', 20, '男')

注意:傳遞和定義參數(shù)的順序級(jí)個(gè)數(shù)必須一致狠裹。

關(guān)鍵字參數(shù)

函數(shù)調(diào)用虽界,通過"鍵=值"形式加以指定√尾ぃ可以讓函數(shù)更加清晰莉御、容易使用,同時(shí)也清除了參數(shù)的順序需求碗暗。

def user_info(name, age, gender):
  print(f'您的名字是{name}, 年齡是{age}, 性別是{gender}')

user_info('Rose', age=20, gender='女')
user_info('小明', gender='男', age=16')

注意:函數(shù)調(diào)用時(shí)颈将,如果有位置參數(shù)時(shí),位置參數(shù)必須在關(guān)鍵字參數(shù)前面言疗,但關(guān)鍵字參數(shù)之間不存在先后順序晴圾。

缺省參數(shù)

也叫默認(rèn)參數(shù),為參數(shù)提供默認(rèn)值噪奄,調(diào)用函數(shù)時(shí)可不傳該默認(rèn)參數(shù)的值死姚。

注意:所有位置參數(shù)必須出現(xiàn)在默認(rèn)參數(shù)前,包括函數(shù)定義和調(diào)用)

def user_info(name, age, gender='男'):
    print(f'您的名字是{name}勤篮,年齡是{age}都毒,性別是{gender}')


user_info('Tom', 20)
user_info('Rose', 18, '女')
user_info('Mike', 29)  # 您的名字是Mike,年齡是29碰缔,性別是男

注意:調(diào)用函數(shù)時(shí)账劲,如果為缺省參數(shù)傳值則修改默認(rèn)參數(shù)值,否則使用這個(gè)默認(rèn)值金抡。

不定長(zhǎng)參數(shù)
  • 包裹位置傳遞
def user_info(*args):
    print(args)


# ('Tom', )
user_info('Tom')
# ('Tom', 18)
user_info('TOm', 18)

注意:傳進(jìn)的所有參數(shù)都會(huì)被args變量收集瀑焦,它會(huì)根據(jù)傳進(jìn)參數(shù)的位置合并一個(gè)元組(tuple),args是元組類型梗肝,這就是包裹位置傳遞何吝。

  • 包裹關(guān)鍵字傳遞
def user_info(**kwargs):
    print(kwargs)


# {'name': 'Tom', 'age': 18, 'id': 110}
user_info(name='Tom', age=18, id=110)

綜上:無論是包裹位置傳遞還是包裹關(guān)鍵字傳遞齐唆,都是一個(gè)組包的過程祸挪。

拆包和交換變量值

拆包
  • 元組拆包
def return_num():
    return 100, 200


num1, num2 = return_num()
print(num1)     # 100
print(num2)     # 200
  • 字典拆包
dict1 = {'name': 'Tom', 'age': 18}
a, b = dict1

# 對(duì)字典進(jìn)行拆包玖媚,取出來的是字典的key
print(a)    # name
print(b)    # age

print(dict1[a])     # Tom
print(dict1[b])     # 18
交換變量值

需求:有變量a = 10b = 20,交換兩個(gè)變量的值

  • 方法一
    借助第三個(gè)變量
a = 10
b = 20

# 1. 定義中間變量
c = 0

# 2. 將a的數(shù)據(jù)存儲(chǔ)到c
c = a

# 3. 將b的數(shù)據(jù)20賦值到a坝锰,此時(shí)a = 20
a = b

# 4. 將之前c的數(shù)據(jù)10賦值到b粹懒,此時(shí)b = 10
b = c

print(a)    # 20
print(b)    # 10
  • 方法二
a, b = 1, 2
a, b = b, a
print(a)    # 2
print(b)    # 1

引用

id()判斷兩個(gè)變量是否為同一個(gè)值得引用。

# 1. int類型
a = 1
b = a

print(b)    # 1

print(id(a))    # 4424870544
print(id(b))    # 4424870544

a = 2
print(b)    # 1. 說明int類型為不可變類型

print(id(a))    # 4424870576
print(id(b))    # 4424870544

# 2. 列表
aa = [10, 20]
bb = aa

print(id(aa))   # 4321400320
print(id(bb))   # 4321400320

aa.append(30)
print(bb)   # [10, 20, 30]顷级,列表為可變類型

print(id(aa))   # 4321400320
print(id(bb))   # 4321400320
引用當(dāng)做實(shí)參
def test1(a):
    print(a)
    print(id(a))

    a += a

    print(a)
    print(id(a))


# int:計(jì)算前后id值不同
b = 100
test1(b)

# 列表:計(jì)算前后id值相同
c = [11, 22]
test1(c)

效果圖如下:


image-20190220111744493.png

可變和不可變類型

  • 可變類型
    • 列表
    • 字典
    • 集合
  • 不可變類型
    • 整型
    • 浮點(diǎn)型
    • 字符串
    • 元組

總結(jié)

  • 變量作用域
    • 全局:函數(shù)體內(nèi)外都能生效
    • 局部:當(dāng)前函數(shù)體內(nèi)部生效
  • 函數(shù)多返回值寫法
return 表達(dá)式1, 表達(dá)式2...
  • 函數(shù)的參數(shù)
    • 位置參數(shù)
      • 形參和實(shí)參的個(gè)數(shù)和書寫順序必須一致
    • 關(guān)鍵字參數(shù)
      • 寫法: key=value
      • 特點(diǎn):形參和實(shí)參的書寫順序可以不一致崎淳;關(guān)鍵字參數(shù)必須書寫在位置參數(shù)的后面
    • 缺省參數(shù)
      • 缺省參數(shù)就是默認(rèn)參數(shù)
      • 寫法:key=value
    • 不定長(zhǎng)位置參數(shù)
      • 收集所有位置參數(shù),返回一個(gè)元組
    • 不定長(zhǎng)關(guān)鍵字參數(shù)
      • 收集所有關(guān)鍵字參數(shù)愕把,返回一個(gè)字典
  • 引用:Python中拣凹,數(shù)據(jù)的傳遞都是通過引用
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恨豁,隨后出現(xiàn)的幾起案子嚣镜,更是在濱河造成了極大的恐慌,老刑警劉巖橘蜜,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菊匿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡计福,警方通過查閱死者的電腦和手機(jī)跌捆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來象颖,“玉大人佩厚,你說我怎么就攤上這事∷刀” “怎么了抄瓦?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)陶冷。 經(jīng)常有香客問我钙姊,道長(zhǎng),這世上最難降的妖魔是什么埂伦? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任煞额,我火速辦了婚禮,結(jié)果婚禮上沾谜,老公的妹妹穿的比我還像新娘膊毁。我一直安慰自己,他們只是感情好类早,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布媚媒。 她就那樣靜靜地躺著,像睡著了一般涩僻。 火紅的嫁衣襯著肌膚如雪缭召。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天逆日,我揣著相機(jī)與錄音嵌巷,去河邊找鬼。 笑死室抽,一個(gè)胖子當(dāng)著我的面吹牛搪哪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坪圾,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼晓折,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼惑朦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漓概,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤漾月,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后胃珍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梁肿,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年觅彰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吩蔑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡填抬,死狀恐怖烛芬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痴奏,我是刑警寧澤蛀骇,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站读拆,受9級(jí)特大地震影響擅憔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檐晕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一暑诸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辟灰,春花似錦个榕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至继控,卻和暖如春械馆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背武通。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工霹崎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冶忱。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓尾菇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子派诬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容