python0基礎學習之函數

今天給大家帶來函數的知識分享。

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.無論對錯 請告知答案

上述的習題我都提供了拙劣的代碼示例,僅供列位參考。習題參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章