cuda默認函數與c++沖突_好程序員Python教程系列-第8講:函數和模塊

  好程序員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)

函數的作用

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

定義函數

數學上的函數通常形如 或者 這樣的形式,在 中,f是函數的名字,x是函數的自變量,y是函數的因變量;而 中,g是函數名,x和y是函數的自變量,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!,因為我們先導入了module2的foo,后導入了module1的foo 。如果兩個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就能夠直接使用的,我們將其稱之為內置函數,這些內置函數都是很有用也是最常用的,下面的表格列出了一部分的內置函數。

2127ed5012fa3617fc8a700a4166b9f9.png

簡單的總結

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443305.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443305.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443305.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【算法系列之七】合并兩個有序鏈表

將兩個有序鏈表合并為一個新的有序鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 示例: 輸入:1->2->4, 1->3->4 輸出:1->1->2->3->4->4/*** Definition for singly-linked list.* public cla…

mfc讓圖片與按鈕一起_對許多張圖片進行批量裁剪,看看我是如何快速做到的

概要:當我們需要對很多圖片進行批量裁剪時,以往的辦法是自己一張一張圖片去操作,非常麻煩。有沒有這樣一個工具,能夠幫我們批量進行處理呢?之前小編在網上找了非常多的軟件,一個一個地安裝試用,…

【算法系列之八】刪除鏈表的倒數第N個節點

給定一個鏈表,刪除鏈表的倒數第 n 個節點,并且返回鏈表的頭結點。 示例: 給定一個鏈表: 1->2->3->4->5, 和 n 2.當刪除了倒數第二個節點后,鏈表變為 1->2->3->5.說明: 給定的 n 保證是有效的…

手寫分頁sql_分頁查詢SQL語句

表結構:DROP TABLE IF EXISTS zhoufoxcn.userlist;CREATE TABLE zhoufoxcn.userlist (UserId int(10) unsigned NOT NULL auto_increment,UserName varchar(45) NOT NULL,Age int(10) unsigned NOT NULL default 10,Sex tinyint(3) unsigned NOT NULL default 1,Ta…

【算法系列之九】合并兩個有序數組

給定兩個有序整數數組 nums1 和 nums2,將 nums2 合并到 nums1 中,使得 num1 成為一個有序數組。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。你可以假設 nums1 有足夠的空間(空間大小大于或等于 m n)來保存 nums2 …

把網卡指定給vm虛擬機_為VMWare虛擬網卡指定靜態的MAC地址

當你把虛擬機移到另一臺主機或在同一臺主機但不同的路徑時,虛擬機的MAC地址將會更改。默認情況下VMWare會保證MAC地址的唯一性卻不保存固定性,在每次開啟虛擬機里的系統時都可能重新分配MAC地址來保證唯一性,若你想保證即使虛擬機被移動后&am…

【算法系列之十】三數之和

給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a b c 0 ?找出所有滿足條件且不重復的三元組。 注意:答案中不可以包含重復的三元組。 例如, 給定數組 nums [-1, 0, 1,…

android 動態獲取全縣_省市縣 ------ 三級滾動(android)

預先加載仿滾輪實現的全部數據mCityPickerView.init(this);③ 點擊響應:ss.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {CityConfig cityConfig new CityConfig.Builder().title("選擇城市")//標題.build();m…

發電廠電氣部分第三版pdf_火力發電廠電氣主接線的特點

根據火力發電廠的容量及其在電力系統中的地位,一般可將火力發電廠分為區域性火力發電廠和地方性火力發電廠。這兩類火力發電廠的電氣主接線有各自的特點。一、區域性火力發電廠的電氣主接線1、單機容量及總裝機容量都較大單機容量多為300MW、600MW和少量1000MW,電廠…

【算法系列之十一】k個一組翻轉鏈表

給出一個鏈表,每 k 個節點一組進行翻轉,并返回翻轉后的鏈表。 k 是一個正整數,它的值小于或等于鏈表的長度。如果節點總數不是 k 的整數倍,那么將最后剩余節點保持原有順序。 示例 : 給定這個鏈表:1->2->3-&g…

ghostblog主題_讀Ghost博客源碼與自定義Ghost博客主題

我使用的Ghost博客一直使用者默認的Casper主題。我向來沒怎么打理過自己博客,一方面認為自己不夠專業,很難寫出質量比較高的文字;另一方面認為博客太耗時間,很容易影響正常的工作內容。最近公司即將搬遷,我的開發工作也…

【算法系列之十二】最接近的三數之和

給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。 例如,給定數組 nums [-1,2,1,-4], 和 target 1…

定義一個dto對象_業務代碼的救星——Java 對象轉換框架 MapStruct 妙用

在業務項目的開發中,我們經常需要將 Java 對象進行轉換,比如從將外部微服務得到的對象轉換為本域的業務對象 domainobject,將 domainobject 轉為數據持久層的 dataobject,將 domainobject 轉換為 DTO 以便返回給外部調用方等。在轉…

JVM調優總結 -Xms -Xmx -Xmn -Xss

堆大小設置 JVM 中最大堆大小有三方面限制:相關操作系統的數據模型(32-bt還是64-bit)限制;系統的可用虛擬內存限制;系統的可用物理內存限制。32位系統 下,一般限制在1.5G~2G;64為操作系統對內存…

discuz設置用戶每天回帖數_[建站教程]Discuz3.4設置QQ互聯登陸教程

雖然現在很多人已經不在使用QQ了,但瘦死的駱駝比馬大,QQ的用戶基數還是很大,而且QQ里有大量的年輕用戶,像我的表妹,表弟剛上初中。他們是忠誠的QQ用戶。為了獲取這批年輕的用戶,我們還是有必要讓網站支持QQ…

五種線程池的對比與使用

今天對五種常見的java內置線程池進行講解。 線程使用的demo public static void cache() {ExecutorService pool Executors.newCachedThreadPool();long start System.currentTimeMillis();pool.execute(() -> {int sum 0;for (int i 0; i < 10; i) {sum (int) Ma…

16進制加法 keil_C/C++編程筆記:C語言進制詳解,二進制、八進制和十六進制

我們平時使用的數字都是由 0~9 共十個數字組成的&#xff0c;例如 1、9、10、297、952 等&#xff0c;一個數字最多能表示九&#xff0c;如果要表示十、十一、二十九、一百等&#xff0c;就需要多個數字組合起來。例如表示 58 的結果&#xff0c;一個數字不夠&#xff0c;只能”…

MySQL的索引是什么?怎么優化?

索引類似大學圖書館建書目索引&#xff0c;可以提高數據檢索的效率&#xff0c;降低數據庫的IO成本。MySQL在300萬條記錄左右性能開始逐漸下降&#xff0c;雖然官方文檔說500~800w記錄&#xff0c;所以大數據量建立索引是非常有必要的。MySQL提供了Explain&#xff0c;用于顯示…

通達信板塊監控指標_通達信洞察強勢板塊指標公式

N:13;P:4;RN:27;VVAR1:(MA(CLOSE,80)-MA(CLOSE,13)/3);VVAR2:( MA((CLOSE-VVAR1)/VVAR1,1));VVAR3:(CLOSE-LLV(LOW,28))/(HHV(HIGH,28)-LLV(LOW,28))*100;VVAR4:SMA(VVAR3,4,1);MMA:EMA(VVAR2,12)*0.7;MMB:EMA(VVAR2,3);快到底:IF(LLV(MMB-MMA,12)>0,0,-20),LINETHICK2,COLO…

12306能刪候補訂單記錄_12306候補購票功能在哪里怎么用 火車票候補購票使用攻略...

12月27日&#xff0c;12306火車票官方推出了一個「候補購票」功能&#xff0c;目前已經開啟春運試點&#xff0c;對于購買火車票的用戶來說&#xff0c;當沒票可買的時候&#xff0c;可以提交候補購票&#xff0c;又多了一種購票途徑了。不過&#xff0c;很多小伙伴對于候補購票…