一、定義函數和調用函數
在使用函數之前必須先定義函數,定義函數的語法格式如下:
def 函數名(形參列表):
//由零條到多條可執行語句組成的函數
[return [返回值]]
python 的聲明函數必須使用def關鍵字。
# 函數的定義
def my_max(x, y):
z = x if x > y else y
return z
def say_hi(name):
print("====正在執行say_hi()函數====")
return name + ",您好!"
a = 6
b = 9
print(my_max(a, b))
print(say_hi("段趙旭"))
# 函數說明文檔:只要把一段字符串放在函數聲明之後,函數體之前,這段字符串將被作爲函數的部分,這個文檔就是
# 函數的說明文檔
# 程序即可通過help()函數查詢函數的說明文檔,也可通過函數的_doc_屬性訪問函數的說明文檔。下面程序示範了爲函數
# 編寫說明文檔
def my_max(x, y):
"""
獲取兩個數值之間較大數的函數
:param x:
:param y:
:return:
"""
# 定義一個變量z,該變量等於x,y中較大的值
z = x if x > y else y
return z
help(my_max)
print(my_max.__doc__)
# 多個返回值,被自動封裝成元組的形式返回
def sum_and_avg(list):
sum = 0
count = 0
for e in list:
if isinstance(e, int) or isinstance(e, float):
count += 1
sum += e
return sum, count
my_list = [20, 15, 2.8, 'a', 35, 5.9, -1.8]
# 元組的形式
tp = sum_and_avg(my_list)
print(tp)
# 使用序列解包的形式
s, avg = sum_and_avg(my_list)
print(s)
print(avg)
# 遞歸函數
def fn(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return n * fn(n - 1)
print("fn(10)的結果是:", fn(3))
# 函數關鍵字的使用
def grith(width, height):
print("width:", width)
print("height:", height)
return 2 * (width + height)
print(grith(3.5, 4.8))
print(grith(width=3.5, height=4.8))
print(grith(height=4.8, width=3.5))
print(grith(3.5, height=4.8))
# 關鍵字參數必須位於位置參數之後,否則報錯
# print(grith(width=3.5,4.8))
# 參數默認值
def say_hi(name="孫悟空", message="歡迎來到瘋狂軟件"):
print(name, ",您好")
print("消息是:", message)
# 全部使用默認參數
say_hi()
# 只有message參數使用默認值
say_hi("白骨精")
# 兩個參數都不使用默認值
say_hi("白骨精", "123")
# 只有name參數使用默認值
say_hi(message="歡迎學習python")
# 定義函數的時候也是一樣,默認值參數必須放到位置參數之後
# def test(name="zhangsan",age):
# 個數可變的參數
def test(a, *books):
print(books)
for b in books:
print(b)
print(a)
test(5, "瘋狂ios講義", "瘋狂android講義")
"""輸出可以看到可變參數傳入到函數之後封裝成了元組
('瘋狂ios講義', '瘋狂android講義')
瘋狂ios講義
瘋狂android講義
5"""
# 定義了支持參數收集的函數
def test(x, y, z=3, *books, **scores):
print(x, y, z)
print(books)
print(scores)
test(9, 8, 3, "asd", "asd", 語文="sad", 數學="math")
"""輸出
9 8 3
('asd', 'asd') 可變長參數變成了元組
{'語文': 'sad', '數學': 'math'} 可變長關鍵字參數變成了字典
"""
def test(name, message):
print()
print()
my_list = ['孫悟空', '歡迎來到瘋狂軟件']
test(*my_list)
# 逆向參數收集
def foo(name, *nums):
print("name參數:", name)
print("nums參數:", nums)
my_tuple = (1, 2, 3)
foo("asd", *my_tuple)
# 字典關鍵字參數:程序使用逆向收集即可將my_dict包含的三個kv對以關鍵字參數的形式傳給
# bar()函數
def bar(book, price, desc):
print(book, "這本書的價格是:", price)
print('描述信息', desc)
my_dict = {'price': 89, 'book': '瘋狂python講義', 'desc': '這是一本系統全面的python學習圖書'}
bar(**my_dict)
# 變量作用域
"""python提供瞭如下的三個工具函數來獲取指定範圍內的變量字典
globals() 該函數返回全局範圍內所有變量組成的變量字典
locals() 該函數返回當前局部範圍內所有變量組成的變量字典
vars(object) 獲取在指定對象範圍內所有變量組成的變量字典,如果不傳入object
參數,vars()和locals()的作用完全相同
"""
# 在函數中聲明全局變量
name = 'Charlie'
def test():
# 聲明name是全局變量,後面的賦值語句不會重新定義局部變量
global name
# 直接訪問name全局變量
print(name) # charlie
name = "孫悟空"
test()
print(name)
"""增加了global name聲明之後,程序會把name變量當成全局變量,這意味着test()函數後面對name賦值的語句只是對
全局變量賦值,而不是重新定義局部變量"""
# 局部函數
def get_math_func(type, nn):
def square(n):
return n * n
def cube(n):
return n * n * n
def factorial(n):
result = 1
for index in range(2, n + 1):
result *= index
return result
if type == 'square':
return square(nn)
elif type == 'cube':
return cube(nn)
else:
return factorial(nn)
print(get_math_func('square', 3))
print(get_math_func('cube', 3))
print(get_math_func('factorial', 3))
def foo():
# 局部變量name
name = 'Charlie'
def bar():
#bar函數中就不必在重新定義name變量,就可以直接訪問foo函數中的name變量了
nonlocal name
# 訪問bar()函數所在foo()函數內的name局部變量
print(name)
name = '孫悟空'
print(name)
bar()
foo()
"""nonlocal和前面的global功能大致類似,區別是global用於聲明訪問全局變量,而
nonlocal用於聲明訪問當前函數所在函數內的局部變量"""
二、函數的高級內容
# 使用函數變量
def pow(base, exponent):
result = 1
for i in range(1, exponent + 1):
result *= base
return result
my_fun = pow
print(my_fun(3, 4))
def area(x, y):
return x * y
my_fun = area
print(my_fun(3, 4))
def map(data,fn):
return fn(data,data)
print(map(5,my_fun))
#函數可以作爲變量,參數,以及函數的返回值
#局部函數沒有太大的意義,那麼就考慮使用lambda表達式來簡化局部函數的寫法。
def get_math_func(type):
result = 1
#該函數返回的是lambda表達式
if type == 'sq':
return lambda n:n*n
elif type == 'cube':
return lambda n:n*n*n
else:
return lambda n:(1+n)*n/2
"""lambda表達式只能是單行表達式,不允許使用更加複雜的函數形式,
lambda表達式的語法格式如下:
lambda [參數列表]: 表達式
"""
x=map(lambda x:x*x,range(8))
print([e for e in x])
y=map(lambda m:m*m if m%2==0 else 0,range(8))
print([e for e in y])