中文在线免费看视频_国产成人精品亚洲日本在线观看_亚洲精品第一综合99久久_国产亚洲精品日韩综合网

當前位置: 首頁 / 推薦閱讀 / 正文
好程序員Python教程系列-第8講:函數和模塊

2020-04-22

好程序員 Python培訓

  好程序員Python教程系列-第8講:函數和模塊,在講解本章節的內容之前,我們先來研究一道數學題,請說出下面的方程有多少組正整數解。

  事實上,上面的問題等同于將8個蘋果分成四組每組至少一個蘋果有多少種方案,所以答案應該是  。組合數的計算公式如下所示。

  根據我們前面學習的知識,可以用循環做累乘來計算階乘,那么通過下面的Python代碼我們就可以計算出組合數  的值,代碼如下所示。

"""

輸入M和N計算C(M,N)

 

Version: 0.1

Author: 駱昊

"""

m = int(input('m = '))

n = int(input('n = '))

# 計算m的階乘

fm = 1

for num in range(1, m + 1):

    fm *= num

# 計算n的階乘

fn = 1

for num in range(1, n + 1):

    fn *= num

# 計算m-n的階乘

fm_n = 1

for num in range(1, m - n + 1):

    fm_n *= num

# 計算C(M,N)的值

print(fm // fn // fm_n)

函數的作用

不知道大家是否注意到,上面的代碼中我們做了三次求階乘,雖然mnm - n的值各不相同,但是三段代碼并沒有實質性的區別,屬于重復代碼。的編程大師Martin Fowler先生曾經說過:代碼有很多種壞味道,重復是壞的一種!”。要寫出高質量的代碼首先要解決的就是重復代碼的問題。對于上面的代碼來說,我們可以將計算階乘的功能封裝到一個稱之為“函數”的功能模塊中,在需要計算階乘的地方,我們只需要“調用”這個“函數”就可以了。

定義函數

數學上的函數通常形如  或者  這樣的形式,在  中,f是函數的名字,x是函數的自變量,y是函數的因變量;而  中,g是函數名,xy是函數的自變量,z是函數的因變量。Python中的函數跟這個結構是一致的,每個函數都有自己的名字、自變量和因變量。我們通常把Python中函數的自變量稱為函數的參數,而因變量稱為函數的返回值。

Python中可以使用def關鍵字來定義函數,和變量一樣每個函數也應該有一個漂亮的名字,命名規則跟變量的命名規則是一致的。在函數名后面的圓括號中可以放置傳遞給函數的參數,就是我們剛才說到的函數的自變量,而函數執行完成后我們會通過return關鍵字來返回函數的執行結果,就是我們剛才說的函數的因變量。

我們可以用函數的知識對上面的代碼進行重構(不影響代碼執行結果的前提下對代碼的結構進行調整),重構之后的代碼如下所示。

"""

輸入M和N計算C(M,N)

 

Version: 0.1

Author: 駱昊

"""

 

 

# 定義函數:def是定義函數的關鍵字、fac是函數名,num是參數(自變量)

def fac(num):

    """求階乘"""

    result = 1

    for n in range(1, num + 1):

        result *= n

    # 返回num的階乘(因變量)

    return result

 

 

m = int(input('m = '))

n = int(input('n = '))

# 當需要計算階乘的時候不用再寫重復代碼而是直接調用函數fac

# 調用函數的語法是在函數名后面跟上圓括號并傳入參數

print(fac(m) // fac(n) // fac(m - n))

函數的參數

參數的默認值

Python語言中,如果函數中沒有return語句,那么函數默認返回代表空值的None。另外,在定義函數時,函數也可以沒有自變量,但是函數名后面的圓括號是必須有的。Python中還允許函數的參數擁有默認值,例如我們把上一課中搖色子獲得點數的功能定義到一個函數中,我們可以寫出如下所示的代碼。

"""

參數的默認值1

 

Version: 0.1

Author: 駱昊

"""

from random import randint

 

 

# 定義搖色子的函數,n表示色子的個數,默認值為2

def roll_dice(n=2):

    """搖色子返回總的點數"""

    total = 0

    for _ in range(n):

        total += randint(1, 6)

    return total

 

 

# 如果沒有指定參數,那么n使用默認值2,表示搖兩顆色子

print(roll_dice())

# 傳入參數3,變量n被賦值為3,表示搖三顆色子獲得點數

print(roll_dice(3))

我們再來看一個為簡單的例子。

"""

參數的默認值2

 

Version: 0.1

Author: 駱昊

"""

 

 

def add(a=0, b=0, c=0):

    """三個數相加求和"""

    return a + b + c

 

 

# 調用add函數,沒有傳入參數,那么a、b、c都使用默認值0

print(add())         # 0

# 調用add函數,傳入一個參數,那么該參數賦值給變量a, 變量b和c使用默認值0

print(add(1))        # 1

# 調用add函數,傳入兩個參數,1和2分別賦值給變量a和b,變量c使用默認值0

print(add(1, 2))     # 3

# 調用add函數,傳入三個參數,分別賦值給a、b、c三個變量

print(add(1, 2, 3))  # 6

# 傳遞參數時可以不按照設定的順序進行傳遞

print(add(c=50, a=100, b=200))

可變參數

接下來,我們還可以實現一個對任意多個數求和的add函數,因為Python語言中的函數支持可變參數,所謂可變參數指的是在調用函數時,可以向函數傳入0個或任意多個參數。將來我們以團隊協作開發的模式做商業項目時,可能需要去設計一個函數給其他人使用,但我們又不知道函數的調用者會向該函數傳入多少個參數,這個時候可變參數就可以派上用場。下面的代碼演示了用可變參數實現對任意多個數求和的add函數。

"""

可變參數

 

Version: 0.1

Author: 駱昊

"""

 

 

# 在參數名前面的*表示args是一個可變參數

def add(*args):

    total = 0

    # 可變參數可以放在for循環中取出每個參數的值

    for val in args:

        total += val

    return total

 

 

# 在調用add函數時可以傳入0個或任意多個參數

print(add())

print(add(1))

print(add(1, 2))

print(add(1, 2, 3))

print(add(1, 3, 5, 7, 9))

用模塊管理函數

不管用什么樣的編程語言來寫代碼,給變量、函數起名字都是一個讓人頭疼的問題,因為我們會遇到命名沖突這種尷尬的情況。簡單的場景就是在同一個.py文件中定義了兩個同名的函數,如下所示。

def foo():

    print('hello, world!')

 

 

def foo():

    print('goodbye, world!')

 

 

foo()    # 大家猜猜調用foo函數會輸出什么

當然上面的這種情況我們很容易就能避免,但是如果項目是團隊協作多人開發的時候,團隊中可能有多個程序員都定義了名為foo的函數,這種情況下怎么解決命名沖突呢?答案其實很簡單,Python中每個文件就代表了一個模塊(module),我們在不同的模塊中可以有同名的函數,在使用函數的時候我們通過import關鍵字導入指定的模塊再使用完全限定名的調用方式就可以區分到底要使用的是哪個模塊中的foo函數,代碼如下所示。

module1.py

def foo():

    print('hello, world!')

module2.py

def foo():

    print('goodbye, world!')

test.py

import module1

import module2

 

# 用“模塊名.函數名”的方式(完全限定名)調用函數,

module1.foo()    # hello, world!

module2.foo()    # goodbye, world!

在導入模塊時,還可以使用as關鍵字對模塊進行別名,這樣我們可以使用為簡短的完全限定名。

test.py

import module1 as m1

import module2 as m2

 

m1.foo()    # hello, world!

m2.foo()    # goodbye, world!

上面的代碼我們導入了定義函數的模塊,我們也可以使用from...import...語法從模塊中直接導入需要使用的函數,代碼如下所示。

test.py

from module1 import foo

 

foo()    # hello, world!

 

from module2 import foo

 

foo()    # goodbye, world!

但是,如果我們如果從兩個不同的模塊中導入了同名的函數,后導入的函數會覆蓋掉先前的導入,就像下面的代碼中,調用foo會輸出hello, world!,因為我們先導入了module2foo,后導入了module1foo 。如果兩個from...import...反過來寫,就是另外一番光景了。

test.py

from module2 import foo

from module1 import foo

 

foo()    # hello, world!

如果想在上面的代碼中同時使用來自兩個模塊中的foo函數也是有辦法的,大家可能已經猜到了,還是用as關鍵字對導入的函數進行別名,代碼如下所示。

test.py

from module1 import foo as f1

from module2 import foo as f2

 

f1()    # hello, world!

f2()    # goodbye, world!

標準庫中的模塊和函數

Python標準庫中提供了大量的模塊和函數來簡化我們的開發工作,我們之前用過的random模塊就為我們提供了生成隨機數和進行隨機抽樣的函數;而time模塊則提供了和時間操作相關的函數。隨著我們進一步的學習Python編程知識,我們還會用到多的模塊和函數。Python標準庫中還有一類函數是不需要import就能夠直接使用的,我們將其稱之為內置函數,這些內置函數都是很有用也是常用的,下面的表格列出了一部分的內置函數。 

圖表

簡單的總結

函數是功能相對獨立且會重復使用的代碼的封裝。學會使用定義和使用函數,就能夠寫出為的代碼。當然,Python語言的標準庫中已經為我們提供了大量的模塊和常用的函數,用好這些模塊和函數就能夠用少的代碼做多的事情。

好程序員公眾號

  • · 剖析行業發展趨勢
  • · 匯聚企業項目源碼

好程序員開班動態

More+
  • HTML5大前端 <高端班>

    開班時間:2021-04-12(深圳)

    開班盛況

    開班時間:2021-05-17(北京)

    開班盛況
  • 大數據+人工智能 <高端班>

    開班時間:2021-03-22(杭州)

    開班盛況

    開班時間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發 <高端班>

    開班時間:2021-05-10(北京)

    開班盛況

    開班時間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數據分析 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2020-09-21(上海)

    開班盛況
  • 云計算開發 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2019-07-22(北京)

    開班盛況
IT培訓IT培訓
在線咨詢
IT培訓IT培訓
試聽
IT培訓IT培訓
入學教程
IT培訓IT培訓
立即報名
IT培訓

Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號

中文在线免费看视频_国产成人精品亚洲日本在线观看_亚洲精品第一综合99久久_国产亚洲精品日韩综合网

            91精品国产一区二区三区香蕉| 91片在线免费观看| 国产蜜臀97一区二区三区| 色婷婷综合久久久中文一区二区 | 久久免费电影网| 91丝袜美腿高跟国产极品老师| 视频一区欧美精品| 中文字幕一区视频| 欧美剧情片在线观看| 成人丝袜18视频在线观看| 午夜影院在线观看欧美| 国产亚洲精久久久久久| 欧美欧美欧美欧美首页| 成人免费视频免费观看| 无吗不卡中文字幕| 亚洲色图制服丝袜| 久久精品免费在线观看| 欧美二区乱c少妇| 99精品国产视频| 加勒比av一区二区| 日日夜夜精品视频免费| 亚洲图片激情小说| 久久综合九色欧美综合狠狠 | 91在线国产福利| 精品一二三四在线| 丝袜诱惑亚洲看片| 亚洲激情男女视频| 中文字幕一区二区三区av| 欧美xfplay| 日韩一区二区三区免费看| 色激情天天射综合网| 不卡一区二区中文字幕| 久久99在线观看| 日韩av一区二区在线影视| 亚洲综合另类小说| 亚洲欧美另类小说| 日韩伦理电影网| 中文字幕佐山爱一区二区免费| 久久久不卡网国产精品一区| 日韩一区二区精品葵司在线| 欧美日韩国产大片| 欧洲色大大久久| 在线观看免费亚洲| 欧洲亚洲精品在线| 色婷婷综合久久久久中文| 91亚洲精华国产精华精华液| 成人免费黄色大片| thepron国产精品| 成人国产亚洲欧美成人综合网| 国产原创一区二区| 国产美女精品人人做人人爽| 裸体在线国模精品偷拍| 免费成人av在线播放| 麻豆精品一区二区av白丝在线 | 成人高清免费观看| 成人中文字幕在线| 成人一区二区三区视频| 99精品视频在线观看免费| 成人ar影院免费观看视频| 99久久亚洲一区二区三区青草 | 欧美一区二区三区喷汁尤物| 欧美片在线播放| 欧美一卡二卡在线| 欧美videos大乳护士334| 精品奇米国产一区二区三区| 精品国产乱码久久久久久图片 | 国产精选一区二区三区| 国产91精品一区二区麻豆网站| 国产**成人网毛片九色| 成人福利视频网站| 91黄色激情网站| 欧美日韩高清在线| 欧美大度的电影原声| 久久久91精品国产一区二区精品 | 精品久久久久久久久久久院品网| 精品国产污网站| 国产精品午夜在线| 亚洲精品国产a久久久久久| 午夜欧美在线一二页| 黑人巨大精品欧美黑白配亚洲| 国产91丝袜在线播放九色| 一本久久综合亚洲鲁鲁五月天| 欧美日韩一级视频| 久久午夜电影网| 最新久久zyz资源站| 午夜精品久久久久久久99樱桃| 秋霞国产午夜精品免费视频| 国产69精品久久99不卡| 欧美性生活影院| 久久午夜色播影院免费高清| 亚洲色图在线播放| 美日韩黄色大片| av午夜一区麻豆| 69堂亚洲精品首页| 国产精品久久久久久久久图文区| 无吗不卡中文字幕| 不卡视频免费播放| 日韩亚洲欧美成人一区| 18欧美乱大交hd1984| 奇米影视7777精品一区二区| 成人av网站免费观看| 日韩欧美色综合| 亚洲激情自拍偷拍| 国产一区二区女| 欧美日韩aaaaaa| 日韩伦理电影网| 国产精品一二三在| 在线综合视频播放| 又紧又大又爽精品一区二区| 韩国v欧美v亚洲v日本v| 欧美男男青年gay1069videost| 国产欧美日韩精品在线| 日韩av中文在线观看| 日本高清免费不卡视频| 国产日韩精品视频一区| 日韩电影在线观看网站| 日本久久电影网| 中文字幕在线观看不卡| 国产麻豆精品一区二区| 777色狠狠一区二区三区| 自拍偷拍亚洲综合| 国产成人精品综合在线观看| 日韩丝袜美女视频| 午夜视频一区二区三区| 91视频免费观看| 国产日产欧产精品推荐色| 免费成人在线播放| 91精品国产一区二区三区| 亚洲一区二区欧美日韩| 色一区在线观看| 国产精品国产三级国产a| 国产久卡久卡久卡久卡视频精品| 日韩欧美综合一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美日韩一区二区欧美激情| 亚洲影院免费观看| 欧美午夜精品一区二区蜜桃| 亚洲摸摸操操av| 日本精品裸体写真集在线观看| 亚洲三级理论片| 色综合色综合色综合| 最近日韩中文字幕| 91色|porny| 亚洲最大成人网4388xx| 欧美亚洲国产一卡| 婷婷成人综合网| 欧美一区二区三区不卡| 免费成人在线视频观看| 日韩欧美二区三区| 狠狠色丁香久久婷婷综合_中 | 一区二区三区四区不卡在线 | 日韩三级视频在线看| 欧美a级一区二区| 精品福利二区三区| 国产iv一区二区三区| 国产精品卡一卡二卡三| 一本大道久久a久久精品综合| 一区二区三区四区不卡在线 | 国产欧美日韩麻豆91| 成人性生交大片免费看中文| 亚洲色图色小说| 欧美日韩免费观看一区二区三区 | 国产99久久精品| 国产精品久久午夜| 欧洲日韩一区二区三区| 日本欧美久久久久免费播放网| 精品盗摄一区二区三区| 成人一二三区视频| 亚洲国产一区二区三区青草影视| 欧美精品少妇一区二区三区 | 国产精品88888| 亚洲免费在线播放| 欧美一二区视频| 国产福利视频一区二区三区| 亚洲欧美二区三区| 欧美一区二区三区婷婷月色| 国产99精品在线观看| 亚洲午夜电影网| 精品国产露脸精彩对白| 91在线国产福利| 日本va欧美va欧美va精品| 中文字幕欧美国产| 欧美人xxxx| 国产成人日日夜夜| 亚洲国产美国国产综合一区二区| 26uuu久久综合| 一本久久a久久精品亚洲| 麻豆精品一区二区av白丝在线 | 热久久免费视频| 国产精品黄色在线观看| 欧美一区二区三区性视频| 成a人片国产精品| 六月丁香婷婷久久| 亚洲综合视频在线| 久久精品网站免费观看| 欧美精三区欧美精三区| 99久免费精品视频在线观看 | jiyouzz国产精品久久| 日韩vs国产vs欧美| 亚洲精品一二三|