今天給大家帶來函數的知識分享。
1.什麼是函數
具有名稱的能夠完成某一特定功能的代碼的集合,函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段。
2、python如何定義函數
函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號 ()。
任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。
函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。
函數內容以冒號起始,並且縮進。
return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。
def function_name([args...]):
# 函數體
[return 返回值]
3、調用函數
function_name([args…])
比如一個簡單的hello world打印
>>>def hello() :
print("Hello World!")
>>> hello()
Hello World!
4.函數的分類
這裏我用參數來進行分類,分爲有參,無參,有返回值,無返回值。
|-- 定義有沒有參數
|-- 無參函數
|-- 有參函數
函數的參數,要根據實際來決定,是否需要參數
|-- 是否有返回值
|-- 無返回值
|-- 有返回值
在函數中,當遇到return關鍵字的時候,函數會立刻返回
def show(): #無參
print("hell world")
def show_msg(msg): #有參
print("接收到一個信息--->", msg)
def add(x, y): ##兩個參數,有返回值
"""
計算兩個數之和
並且將結果返回
"""
res = x + y
return res
# show()
# show_msg("明天是六一兒童節,大家節日快樂,記得給我禮物哦~~~,猥瑣!!")
num1 = float(input("第一個值:"))
num2 = float(input("第二個值:"))
sums = add(num1, num2)
print("{} + {} = {}".format(num1, num2, sums))
5、全局變量和局部變量
全局變量:定義在模塊(.py)中,可以在該模塊定義後任何地方都可以訪問
局部變量:定義在函數內部的變量,作用域只是在當前函數內有效,出了函數,無法訪問到
在函數中,能不能訪問到全局變量?
當然可以,但是注意:在python中,函數內不允許修改全局變量
如果確實在函數內,需要修改全局變量,必須要提前申明
global 全局變量 ##需要修改全局變量可以使用global,儘量不用
# 定義一個全局變量
# num = 1000
# def say(count):
# # 如果確實在函數內,需要修改全局變量,必須要提前申明
# global num
# print("hello,函數開始運行了")
# # my_count 是定義在函數內部的變量,局部變量
# # 局部變量的作用域只在當前的函數內有效
# my_count = 5000
# print(num)
# # 數量加1
# num += 1
# print(num)
# return
# say(10)
# print(num)
name = "old wang"
def change_name():
global name
# name = "old pan"
name += " is good man"
print(name)
change_name()
print(name)
6、函數的調用
壓棧,函數調用本質就是將堆中的函數調用到棧中執行,這個過程被稱爲壓棧,等函數執行完成,會立刻執行出棧(彈棧),執行函數就是將函數調入棧中執行,執行結束再進行彈棧出來。
7、引用傳遞和值傳遞
值傳遞:本質就是傳遞數據值的拷貝,跟原先的那個值沒有關係
引用傳遞:本質是傳遞指針(地址),所以說實質操作的就是堆
也就是值改變與沒有改變的關係
def add_user(users):
users.append("不法狂徒")
users.append("張三")
if __name__ == "__main__":
# python的main函數
# 注意:python的中main,主要作用是寫在main中的代碼
# 並不會被導入其他模塊中
# num1 = 10
# num2 = 30
# 值傳遞
# num1, num2 = change(num1, num2)
# print(num1)
# print(num2)
# ls是一個列表,對象,存在堆中,ls存儲的堆中的地址
ls = ["趙大", "錢七", "王五", "李四"]
add_user(ls)
print(ls)
8、函數的參數問題
|-- 默認值參數
# 默認值參數,在參數上,給定一個最常用的值,在調用的時候,
# 如果和默認的值一致,就可也不用傳遞這個參數
def get_cricle_area(r, pi=3.14):
pass
注意:默認值參數,必須放在普通後面!!!
|-- 可變參數
def show(name, age=16, *args):#可寫可不寫稱爲可變
pass
args以元組的形式保存
|-- # 命名參數(關鍵字參數)
def show2(name, age, **kwargs):
pass
kwargs是以字典的形式保存
# 默認值參數,在參數上,給定一個最常用的值,在調用的時候,
# 如果和默認的值一致,就可也不用傳遞這個參數
def get_cricle_area(r, pi=3.14):
return r * r * pi
# 可變參數
def show(name, age=16, *args):
print(name)
print(age)
print(args)
# 命名參數(關鍵字參數)
def show2(name, age, **kwargs):
print(name)
print(age)
print(kwargs["address"])
print(kwargs.get("height"))
# 萬能參數
def show3(name, age, gender, *args, **kwargs):
pass
if __name__ == '__main__':
# print(get_cricle_area(3, 3.14))
# print(get_cricle_area(3, 3.141592))
# print(get_cricle_area(3, 3.1415926535))
# print(get_cricle_area(3))
# print(get_cricle_area(3, 4))
# show("帥波", 20, "123456", "男")
show2("帥波", 20, gender="男", address="四川瀘州", height=1.75)
9、函數遞歸
函數自身調用自身
注意:必須要有終止條件,沒有終止條件的遞歸是一個死循環
超過遞歸的上限:會拋出異常:StackOverflowException
import sys
# python中規定遞歸默認不能超過1000次
print(sys.getrecursionlimit())
# 修改遞歸的默認極限值
sys.setrecursionlimit(10000)
def get_sum(n):
# 遞歸必須要有終止條件,如果沒有終止條件,遞歸就是一個死循環
# 直到棧溢出爲止
if n == 1:
return 1
return n + get_sum(n - 1) ##如用其他語言這樣寫遞歸,會報超過數字上限
res = get_sum(100)
print(res)
學會函數可以在下列的這些習題中體會函數的參數傳遞問題:
這些習題大多在我之前的博客中都有解答。不過現在用函數實現。
1.定義一個函數,傳遞文件路徑,獲取文件的後綴名
2:輸入一個數字(年份,如2000年),定義函數,判斷該年份是否是閏年
3:將之前的打印*組成三角形的代碼,改造成函數,要求如下(定義好多函數的):
1、打印的層數有調用者決定
2、如果是菱形的話,判斷用戶必須輸入才層數爲奇數纔行
4:定義一個函數,判斷該數是不是質數
5:做一個計算器函數,輸入三個參數(兩個數字,一個符號)。
如輸入:5 6 + ,則輸出: 5+6=11
6:定義函數,打印九九乘法表
7:使用函數完成一個0~n之間的奇數的積。
8:使用遞歸完成1~100之間的積
9:找出10000以內能被5或6整除,但不能被兩者同時整除的數(函數)
10:使用函數求三角形的面積和周長(已知三邊的情況下,提示:海倫公式)
import math
math.sqrt(數據) # 表示開平方根
math.sqrt(4) #
是不是完成了上面的十道題都覺得函數十分的簡單呢?
可以再試着對下面的題目進行練習。
1、寫一個方法,在方法內依次打印出列表每個元素
的值。
2、寫一個方法,計算列表所有元素的和(注意返回值
)。
3、寫一個方法,計算列表所有奇數下標元素的和(注
意返回值)。
4、寫一個方法,計算列表所有偶數下標元素的和(注
意返回值)。
5、寫一個方法可以計算兩個數的和,想想這個方法
有哪些參數,返回值。
6、寫一個方法可以計算兩個數的商(分母不能爲0),
想想這個方法有哪些參數,返回值是什麼。
7、寫一個方法將傳入的天、小時、分鐘、秒的總和
轉換爲秒,比如0天、2小時、5分、7秒,他們代表的
總秒數爲2*3600+5*60+7=7507秒。想想這個方法
有哪些參數,返回值是什麼類型。
8、寫一個方法交換整型列表中兩個指定下標元素的
值。想想這個方法有哪些參數,返回值是什麼類型。
9、寫一個方法計算整型列表中所有能被3整除元素的
個數。想想這個方法有哪些參數,返回值是什麼類
型。
10、寫一個方法將整型數字(int)轉換爲格式化的字符
串(string),現要求如下:
a.可以指定轉換後[字符串的長度];
b.當數字的長度不足指定的長度,讓這個字符串右對
齊,指定[左邊補的字符(char)];
例如,假設現在將指定的數字轉換爲固定長度爲8的
字符串,如果長度不足,左邊補'0',那麼27這個數字
就會轉換爲字符串"00000027"。
根據要求,想想這個方法有哪些參數,返回值是什麼
類型。
11.用方法實現找出一個int類型列表中最大值和最小
值
12.判斷一個數是否是質數(素數)?該如何聲明方
法?
13. 將指定的秒數轉變爲幾小時幾分幾秒。
14.使用Random類給一個數組的所有元素賦隨機初值
(不重複)。
15.判斷一個整型數組是否是對稱的。所謂對稱就是
第一個元素等於最後一個元素,第二個元素等於倒數
第二個元素,依次類推,例如【7,3,1,3,7】就
是對稱的。
16.打印一個元組的所有值。
17.查找一個元組中某個值是否存在,如果存在返回
這個值的索引,否則返回-1。
18.將一個列表反轉過來,比如【2,3,1,4,7】轉
換爲【7,4,1,3,2】
19.求一個列表的最大值。
20.求一個列表的最小值。
21.寫一個方法,實現在列表中指定的的位置前插入
一個值。
22.寫一個方法,刪除列表中指定位置的元素。
23.猜數遊戲
1.隨機出現一個數(範圍自定義) 作爲答案
2.提示用戶輸入並根據答案和用戶輸入的大小關係輸
出大了? 小了?
3.5次機會
4.可以重複玩
5.根據猜對的次數進行評價
6.無論對錯 請告知答案
上述的習題我都提供了拙劣的代碼示例,僅供列位參考。習題參考