Python筆記【6】_函數

#!/usr/bin/env/python
#-*-coding:utf-8-*-

#Author:LingChongShi   #查看源碼Ctrl+左鍵

'''
def:函數是一段能夠重複調用的代碼,經過輸入參數,返回對應的結果
格式以下:
def 函數名(形式參數):
    函數體
'''

'''1、定義一個函數'''
def add(a,b):
    pass  #不實現函數功能,只是一個佔位符

'''2、參數'''
#必須參數
def info(name,age,address):
    print('name={0},age={1},address={2}'.format(name,age,address))
    print('name={:s},age={:d},address={:s}'.format(name,age,address))
info('xiaoshao',20,'xian')  #必須參數:實際參數和形式參數按照順序匹配

#關鍵字參數
def info1(name,age,address):
    print('name={0},age={1},address={2}'.format(name,age,address))
    print('name={:s},age={:d},address={:s}'.format(name,age,address))
info1(age=20,address='xian',name='xiaoshao')  #關鍵字參數:制定形式參數對應的實際參數,能夠不用按照順序進行匹配

def info2(name,age,*,address): #聲明函數,參數中*單獨出現,*後面的參數必須使用關鍵字傳入
    print('name={0},age={1},address={2}'.format(name,age,address))
info2('xiaoshao',20,address='xian')

#默認參數
def info3(name,age,address='beijing'):  #函數存在默認參數,默認參數不能放在非默認參數以前
    print('name={0},age={1},address={2}'.format(name,age,address))
info3('xiaoshao',20)  #默認參數:若是沒有傳遞參數,則會使用默認參數

#動態參數,*arg和**kwargs
def info4(name,age,*args):  #*address數據類型是元組
    print('name={0},age={1},args={2}'.format(name,age,args))
info4('xiaoshao',20,'','12345678','shenzhen')  #調用時,以元組的形式存放全部未命名的變量參數
info4('xiaoshao',20)   #調用時,可變形式參數中沒有指明實際參數,即爲一個空元組

def info5(name,age,**kwargs):  #**address數據類型是字典
    print('name={0},age={1},kwargs={2}'.format(name,age,kwargs))
info5('xiaoshao',20,sex='',phone='12345678',address='shenzhen')

def info6(*args,**kwargs):
    print(args,kwargs)
info6()
info6(12,12.33,'中文',[1,2],(3,4),{'a':1},a=4,b='中文')



'''3、return返回值'''
'''一、return[表達式]:調用方法返回表達式,不帶參數值的return語句時,返回值是None;
   二、函數返回值意義:函數/方法返回值是爲了給另一個函數/方法提供一個請求的參數
'''
'''
接口測試:查看用戶信息
一、發送post請求,login請求成功
二、登陸成功後,返回token
三、使用token,能夠查看用戶信息
'''
def login(username,possword):
    if username== 'admin' and possword=='12345':
        return 'ieureuejfdj38028jfkjfkjk'  #使用return能夠進行token的返回
        # print('ieureuejfdj38028jfkjfkjk')   #使用print只是打印token的值,並不返回
    else:
        return 'Login Fail'

def userInfo(token):
    if token=='ieureuejfdj38028jfkjfkjk':
        print('查看到訂單信息')
    else:
        print('退出登陸')

userInfo(login('admin','12345'))


'''4、變量做用域LEGB'''
'''
一、4種變量做用域:
   Local(局部做用域):在一個函數或者方法內部;
   Enclosing(閉包函數外的函數中):嵌套函數,在被包裹函數外部而且在包裹函數內部;
   Global(全局做用域):執行腳本自身的最高層次;
   Built-in(內建做用域):Python自身保留的特殊名稱;
二、LEGB規則:在局部沒有找到,去局部外的局部找(閉包),找不到去全局找,再去內建進行搜索,都找不到產生一個NameError;
三、Python中只有模塊(module)、類(class)、函數(def、lambda)才引入新的做用域;
四、Python中代碼塊(if/elif/else、try/except、for/while等)是不會引入新的做用域,即內部定義的變量,外部也可進行訪問;
'''
'''一、LG--->局部、全局做用域'''
a='全局做用域'
def f():
    print(a)
f()

a1='全局做用域'
def f1():
    a1='局部做用域'
    print(a1)
f1()
print(a1)

'''二、LEG - 局部、閉包與全局做用域'''
a2='全局做用域'
def f2():
    a2='閉包做用域'
    def f3():
        a2='局部做用域'
        print(a2)
    f3()
    print(a2)

f2()
print(a2)

'''三、LEGB - 局部、閉包、全局與內建做用域'''
in_var = 'global variable'

def len1(in_var):
    print('called my len() function')
    l = 0
    for i in in_var:
        l += 1
    return l
def a_func(in_var):
    len_in_var = len1(in_var)   #a_func()函數在嘗試搜索內建(B)命名空間以前,首先會在全局做用域(G)中發現len()
    print('Input variable is of length', len_in_var)

a_func('Hello, World!')

'''5、global和nonlocal關鍵字'''
'''
一、global:當內部做用域想要修改外部做用域時,須要使用global
二、nonlocal:修改嵌套做用域(enclosing 做用域,外層非全局做用域)中變量時,須要使用nonlocal
'''
str='我是全局變量'
def fun1():
    global str  #global:局部變量能夠修改全局變量
    str='我是局部變量'
    print(str)
fun1()
print(str)


def fun2():
    str1='我是閉包變量'
    def fun3():
        nonlocal str1  #修改嵌套做用域中變量時,須要使用nonlocal
        str1='我是局部變量'
        print(str1)
    fun3()
    print(str1)
fun2()

'''6、特殊狀況'''
'''
a=10
def sum():
    a=a+1   #sum函數中的a使用的是局部,未定義,沒法修改
    print(a)
sum()  #結果:報錯
'''
#修改a爲全局變量,經過函數參數傳遞,能夠正常執行
a=10
def sum(a):
    a=a+1
    print(a)
sum(a)
相關文章
相關標籤/搜索