中文在线免费看视频_国产成人精品亚洲日本在线观看_亚洲精品第一综合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久久_国产亚洲精品日韩综合网

            国产 欧美在线| 国产偷v国产偷v亚洲高清| 国产精品久久久久影院老司| 免费欧美日韩国产三级电影| 91精彩视频在线观看| 国产精品视频一区二区三区不卡| 美女www一区二区| 91精品国产色综合久久不卡电影 | 亚洲成a人片在线观看中文| 欧美日韩性生活| 麻豆久久久久久| 亚洲欧美一区二区三区国产精品| 欧美日韩一区二区三区在线 | 久久蜜桃香蕉精品一区二区三区| 亚洲国产一区二区三区青草影视| 欧洲av一区二区嗯嗯嗯啊| 亚洲日本电影在线| 色哟哟在线观看一区二区三区| 国产精品欧美精品| www.成人在线| 亚洲人妖av一区二区| 一本大道久久a久久精二百| 一区二区在线观看免费视频播放| 色94色欧美sute亚洲线路一久 | 色婷婷亚洲精品| 一区二区三区精品| 欧美精品色综合| 蜜臀久久99精品久久久画质超高清 | 韩国精品主播一区二区在线观看| 日韩视频一区在线观看| 精品无人码麻豆乱码1区2区| 国产拍欧美日韩视频二区| 成人午夜在线免费| 伊人性伊人情综合网| 欧美巨大另类极品videosbest | 一区二区三区在线高清| 国产午夜精品一区二区三区视频 | 懂色av一区二区三区蜜臀| 蜜桃av一区二区在线观看| 亚洲激情图片一区| 中文字幕一区二区三区蜜月| 国产性天天综合网| 精品国产区一区| 在线亚洲一区观看| 亚洲精品第一国产综合野| 4438亚洲最大| av电影在线观看一区| 天堂在线亚洲视频| 国产精品色婷婷| 欧美人狂配大交3d怪物一区| 国产毛片一区二区| 亚洲国产精品久久人人爱| 精品久久久久久无| 99国产精品国产精品毛片| 热久久国产精品| 日韩码欧中文字| 亚洲精品一区二区在线观看| 在线精品视频一区二区| 国产在线视频不卡二| 一区二区免费看| 欧美激情一区二区三区全黄| 欧美精品一卡两卡| 91丝袜高跟美女视频| 久久成人免费日本黄色| 一区二区三区日韩欧美精品| 久久免费午夜影院| 欧美精品日韩综合在线| 97久久精品人人做人人爽| 久久精品国产久精国产| 一区二区免费在线| 国产精品久线观看视频| 精品精品国产高清a毛片牛牛 | av毛片久久久久**hd| 国产原创一区二区| 日韩国产高清影视| 亚洲一卡二卡三卡四卡无卡久久 | 亚洲综合免费观看高清完整版| 亚洲已满18点击进入久久| 午夜精品久久久久久久久久久| 免费人成在线不卡| 国产传媒日韩欧美成人| caoporen国产精品视频| 欧美影院一区二区| 欧美成人欧美edvon| 国产精品卡一卡二卡三| 一区二区三区中文字幕电影 | 国产成人av福利| 日本韩国精品在线| 日韩小视频在线观看专区| 中文字幕精品三区| 亚洲一区二区三区四区在线| 日本aⅴ免费视频一区二区三区| 国产精品一区三区| 在线免费观看日韩欧美| 精品久久久久久久人人人人传媒 | 蜜桃av一区二区三区电影| 日本少妇一区二区| 蜜臀av性久久久久av蜜臀妖精 | 日本一区二区三区四区在线视频| 2021国产精品久久精品| 久久女同性恋中文字幕| 久久九九99视频| 国产日产欧美一区二区三区| 国产精品视频线看| 日韩一区欧美小说| 亚洲一区二区三区四区中文字幕| 亚洲福利视频一区二区| 免费成人美女在线观看.| 免费成人在线网站| 国产一区二区精品久久91| 国产成人aaaa| 色综合天天做天天爱| 欧美男人的天堂一二区| 日韩欧美国产成人一区二区| 国产亚洲一区二区三区四区| 国产精品毛片大码女人| 亚洲一区自拍偷拍| 久久成人精品无人区| 成人综合婷婷国产精品久久免费| 99精品视频一区| 欧美美女一区二区在线观看| 欧美一区二区三区四区久久| 2023国产精品| 亚洲精品视频一区| 日韩av一区二区在线影视| 国产一区在线不卡| 97精品国产97久久久久久久久久久久| 欧美色视频一区| 精品国产一区二区在线观看| 中文字幕视频一区| 日韩精品一卡二卡三卡四卡无卡| 国内精品国产三级国产a久久| 99re成人在线| 日韩一区二区在线播放| 亚洲欧洲日韩女同| 热久久国产精品| 99re成人精品视频| 精品国产123| 亚洲激情欧美激情| 国产在线精品免费| 欧美日韩精品一二三区| 国产性天天综合网| 日韩中文字幕麻豆| 99精品视频在线免费观看| 在线综合亚洲欧美在线视频| 综合久久久久综合| 国产一区二区三区国产| 欧美区视频在线观看| 国产精品视频一二三| 久久精品国产99久久6| 欧美伊人久久久久久午夜久久久久| 2020国产精品自拍| 日韩电影免费一区| 在线免费观看成人短视频| 欧美极品aⅴ影院| 蜜桃av一区二区| 欧美怡红院视频| 亚洲日本电影在线| 成人一区二区三区视频| 日韩三级高清在线| 日韩综合小视频| 欧美日韩国产bt| 亚洲综合在线电影| 91视频一区二区| 国产精品青草久久| 久久精品国产**网站演员| 欧美日韩精品二区第二页| 国产精品久久久久久久久果冻传媒 | 成人黄色软件下载| 国产亚洲一区二区三区| 国产一区二区精品久久99| 欧美一区二区三级| 日韩成人一区二区三区在线观看| 在线观看国产日韩| 一区二区久久久| 91豆麻精品91久久久久久| 亚洲欧洲制服丝袜| 91美女福利视频| 亚洲激情综合网| 日本精品免费观看高清观看| 亚洲欧美aⅴ...| 91成人免费在线视频| 亚洲午夜在线观看视频在线| 日本高清无吗v一区| 亚洲午夜久久久久久久久电影院| 色婷婷精品久久二区二区蜜臀av | 成人中文字幕电影| 中文字幕av资源一区| 成+人+亚洲+综合天堂| 中文av一区特黄| 97精品超碰一区二区三区| 一区二区视频在线看| 欧美专区在线观看一区| 视频在线观看91| 精品久久久三级丝袜| 国产v综合v亚洲欧| 亚洲色图丝袜美腿| 欧美日韩在线不卡| 免费观看在线综合色| 久久青草国产手机看片福利盒子|