函數就是將一些語句集中在一起的一個部件,
目的是減少我們同一段代碼的複製粘貼,需要的時候以函數調用來代替,實現代碼的複用
函數定義語法:
def 函數名(0個或多個參數):
函數內要執行的代碼
return 返回值
#函數可以只定義函數名,沒有參數,也沒有返回值
def hello():
print 'Hello World!'
# 函數的調用
res = hello() #Hello World!
print type(res #<type 'NoneType'>
# 函數有返回值
# 函數的命名規則:一個單詞直接小寫
# 多個單詞,每個單詞小寫,以下劃線分隔
def get_list():
return [1,2,3,4]
aList = get_list()
print type(aList),aList
# 函數可以有多個return語句,遇到return語句,跳出函數
def get_smaller(x,y):
if x<y:
return x
print 'x is smaller'
else:
return y
smaller = get_smaller(1,2)
print smaller
# 函數有參數
# 參數:形參和實參,形參和實參要一一對應
def add(x,y):
return x+y
sum = add(1,2)
print sum
# 參數傳遞不正確的情況
# sum = add()
#TypeError: add() takes exactly 2 arguments (0 given)
# sum = add(1,2,3)
#TypeError: add() takes exactly 2 arguments (3 given)
# 默認參數
# 爲了提高程序的健壯性,
# 如果我們想在x,y值不傳的時候,也給出一個默認的結果,就需要用到默認參數
# 參數有默認值之後,可以根據需要傳遞實參
def add(x =2,y=3):
return x+y
sum = add()
print sum
sum = add(1)
print sum
sum = add(1,2)
print sum
# 函數的參數可以是任意類型
def print_item(x):
print x
print_item(1)
print_item(1.0)
print_item('string')
print_item([1,2,3])
print_item((1,2,3))
# 函數的參數可以是不同類型
def print_userinfo(name,age):
print 'username is %s and age is %d'%(name,age)
print_userinfo('xiaoming',18)
# 可以將要傳遞的參數放在tuple中
aTuple = ('xiaoming',18)
print_userinfo(*aTuple)
def print_userinfo(name='name',age=18):
print 'username is %s and age is %d'%(name,age)
# 要傳遞的參數放在字典中
aDict = {'age':20,'name':'xiaoming'}
print_userinfo(**aDict)
# key不對應的情況
aDict = {'height':20,'name':'xiaoming'}
print_userinfo(**aDict)
#TypeError: print_userinfo() got an unexpected keyword argument 'height'
# 可變長度的參數
def print_userinfo(name,age,*tuple_args,**dict_args):
print 'username is %s and age is %d'%(name,age)
print tuple_args
print dict_args
print_userinfo('xiaoming',18)
#username is xiaoxing and age is 18
#()
#{}
# 傳遞參數有冗餘時,直接傳遞會報錯,如何解決
# 冗餘參數會傳遞到tuple_args
print_userinfo('xiaoming',18,170)
#username is xiaoming and age is 18
#(170,)
#{}
aTuple = ('xiaoming',18,170)
print_userinfo(*aTuple)
#username is xiaoming and age is 18
#(170,)
#{}
# 冗餘參數存放到dict_args
print_userinfo(name = 'xiaoming',age = 18,height = 170)
#username is xiaoming and age is 18
#()
#{'height': 170}
# 冗餘參數170,'xiaohong'存放到tuple_args,height = 170 存放到dict_args
print_userinfo('xiaoming',18, 170,'xiaohong',height = 170)、
#username is xiaoming and age is 18
#(170, 'xiaohong')
#{'height': 170}
# 重複傳值給name參數
print_userinfo('xiaoming',18, 170,name = 'xiaohong',height = 170)
#TypeError: print_userinfo() got multiple values for keyword argument 'name'
# 函數內部可以調用其他函數
def cal(x,y):
print x+y
res = cal(1,2)
# 如果一個函數在內部調用自身,這個函數叫做遞歸函數
# 舉例:求一個數n的階乘
# n的階乘爲n*(n-1)*(n-2)...*1
# n! = n*(n-1)!
# n爲1的時候,階乘爲1
def factorial(n):
if n==1:
return 1
else:
return n * factorial(n - 1)
print factorial(5)
# 變量的作用域問題
# 根據變量聲明的位置的不同,變量存在不同的作用域:全局,局部
# 全局變量,局部變量
# 變量的作用域限制了你在哪個地方可以訪問哪個變量
global_var = 'global'
def foo():
local_var = 'local'
print global_var+local_var
foo()
# foo中可以對所有的變量進行訪問,但是函數外只能訪問全局變量,無法訪問函數的內部變量
# local_var是在函數體中定義的,只能在函數foo中使用
# global_var是在函數體外定義的,可以在腳本的任意一個位置訪問
print global_var
# print local_var
# x = 'xiaoming'
# def fun():
# x='xiaohong'
# print x
# fun()
# print x
# 函數內部也可以定義全局變量
# 使用global關鍵字
# 注意:必須要先調用函數,函數體中定義的全局變量才能生效
x = 'xiaoming'
def fun():
x='xiaohong'
global global_y
global_y = 'xiaofang'
print x
fun()
print x
print global_y
# 如何在函數中修改全局變量的值
x = 'xiaoming'
def fun():
global x
x='xiaohong'
print x
fun()
print x
# 匿名函數,lambda
def func(x,y):
return x+y
func = lambda x,y:x+y
# reduce()函數
list1 = [1,2,3]
def add(x,y):
return x+y
print reduce(add,list1)
print reduce(lambda x,y:x+y,range(1,101))