天天看點

[005]Python的函數_基礎_全棧基礎

您好!此筆記的文本和代碼以網盤形式分享于文末!

因個人能力有限,錯誤處歡迎大家交流和指正!基礎部分内容簡單,但多且零散!

python 函數功能和特性
1、定義與建立
定義:函數是一段組織好的,可重複使用的,用來實作某些功能的代碼段
概念 形式 栗子
基本形式

def  函數名(參數1,參數2):

    代碼塊

# 函數的定義

def my_lens():

    """計算字元串的長度"""

    s1 = 'hello function'

    length = 0

    for i in s1:

        length = length + 1

    print(length)

    return

# 函數調用

my_lens()

函數名

隻能包含字元串、下劃線和數字且不能以數字開頭,

一般用_下劃線間隔單詞

注釋

對功能和參數進行說明,寫在函數下面第一行。

"""

這個函數實作了什麼功能

參數1:

參數2:

:return: 是字元串或者清單的長度

"""

調用 函數名(實參1, 實參2)
2、函數的傳回值:return    
用法 栗子 結果
傳回一個值

def ret_demo1():

    """傳回一個值"""

    return "a"

ret1 = ret_demo1()

print(ret1)

a <class 'str'>

傳回多個值

1個變量接收

def ret_demo2():

    """傳回多個值,一個變量接收"""

    return 1, 2, 3, 4

def ret_demo3():

    """傳回多個任意類型的值"""

    return 1, 'aB7', [1, '5v'], {'a': '王', }

ret2 = ret_demo2()

ret3 = ret_demo3()

print(ret2, type(ret2))

print(ret3, type(ret3))

(1, 2, 3, 4) <class 'tuple'>

(1, 'aB7', [1, '5v'], {'a': '王'}) <class 'tuple'>

傳回多個值

多個變量接收

有幾個傳回值

就用幾個變量接收

def ret_demo3():

    """傳回多個任意類型的值"""

    return 1, 'aB7', [1, '5v'], {'a': '王', }

a, b, c, d = ret_demo3()

print(a, type(a), '\n', b, type(b), '\n', c, type(c), '\n', d, type(d))

1 <class 'int'>

aB7 <class 'str'>

[1, '5v'] <class 'list'>

{'a': '王'} <class 'dict'>

3、函數的參數:順序:位置參數,*args、預設參數、**kwargs    
用法 栗子 結果
沒有參數 不再舉例  
一個參數

def my_lens(s1):

    """計算字元串的長度"""

    length = 0

    for i in s1:

        length = length + 1

    return length

# 函數調用

s2 = 'hello function'

ret1 = my_lens(s2)

print("字元串長度:%s" % ret1)

字元串長度:14

多個參數

  位置參數

  按位置

  按關鍵字

  混合傳參

def my_max(x, y):

    """比較最大值"""

    the_max = x if x > y else y

    return the_max

m1 = my_max(7, 8)

m2 = my_max(y=9, x=10)

m3 = my_max(15, y=12)

print(m1, m2, m3)

8 10 15
預設參數

def stu_info(name, sex = "Female"):

    """

    列印獅群的資訊,由于獅群母獅較多

    是以預設性别值為‘Female’

    """

    print(name, sex)

stu_info("simba", 'Male')

stu_info("Nala")

simba Male

Nala Female

預設參數

   參數陷阱1

# 預設參數是一個可變資料類型

def fun_trap1(k, l=[]):

    l.append(k)

    print(l)

fun_trap1('Lion')

fun_trap1('Nala')

['Lion']

['Lion', 'Nala']

預設參數

   參數陷阱2

# 預設參數是一個可變資料類型

def fun_trap2(k, l={}):

    """ """

    l[k] = 'v'

    print(l)

fun_trap2(1)

fun_trap2(3)

fun_trap2(4)

{1: 'v'}

{1: 'v', 3: 'v'}

{1: 'v', 3: 'v', 4: 'v'}

動态參數

 *args

# *args 接收的是按照位置傳參的值,組織成一個元組

def my_sum(*args):

    """

    for實作求和函數

    參數*args:動态參數

    return :傳回和,數值

    """

    print(args, type(args))

    the_sum = 0

    for i in  args:

        the_sum += i

    return the_sum

sum1 = my_sum(1, 3, 5, 7)

print(sum1)

(1, 3, 5, 7) <class 'tuple'>

16

動态參數

**kwargs

args必須在kwargs之前

# **kwargs 接受的是按照關鍵字傳參的值,組織成一個字典

def stu_info(**kwargs):

    print(kwargs, type(kwargs))

    print(kwargs['name'], kwargs['sex'])

stu_info(name='simba', sex='Male', name2='Nala', sex2="Female")

{'name': 'simba', 'sex': 'Male', 'name2': 'Nala', 'sex2': 'Female'} <class 'dict'>

simba Male

動态參數

  不一樣的傳參

def func_different1(*args):

    print(args)

def func_different2(**kwargs):

    print(kwargs)

l1 = [1, 'a', '王', 'B7']

d2 = {"a": 1, 'b': 2, }

func_different1(1, 'a', '王', 'B7')

func_different1(*l1)

func_different2(a=1, b=2)

func_different2(**d2)

(1, 'a', '王', 'B7')

(1, 'a', '王', 'B7')

{'a': 1, 'b': 2}

{'a': 1, 'b': 2}

4、命名空間和作用域
命名空間的本質:存放名字與值的綁定關系
三種命名空間的加載順序:内置命名空間(程式運作前加載)->全局命名空間(程式運作中:從上到下加載)->局部命名空間(程式運作中:調用時才加載)
作用域:作用範圍,按照生效範圍可以分為全局作用域和局部作用域;
全局作用域:包含内置名稱空間、全局名稱空間,在整個檔案的任意位置都能被引用、全局有效
局部作用域:局部名稱空間,隻能在局部範圍内生效
   
[005]Python的函數_基礎_全棧基礎
 
用法 栗子 結果
globals和locals方法

c = 55

def func():

    a = 12

    b = 20

    print(locals())

    print(globals())

func()

{'b': 20, 'a': 12}

{'__name__': '__main__',…………,“c”:55,……}

global關鍵字

a = 10

def func():

    global a

    a = 20

print(a)

func()

print(a)

10

20

5、 函數的嵌套 和作用域鍊
函數嵌套調用

def my_max2(x, y):

    the_max = x if x > y else y

    return  the_max

def my_max4(a, b, c, d):

    ret1 = my_max2(a, b)

    ret2 = my_max2(ret1, c)

    ret3 = my_max2(ret2, d)

    return ret3

print(my_max4(10, 6, 77, 8))

77
函數嵌套

def func1():

    print('01 in func1')

    def func2():

        def func3():

            print('003 in func3')

        print('004 in func2')

        func3()

    print('005 in func1')

    func2()

func1()

01 in func1

005 in func1

004 in func2

003 in func3

函數作用域鍊

def f1():

    a = 1

    def f2():

        a = 2

        print('in f2 a:', a)

    f2()

    print('in f2 a:', a)

f1()

in f2 a: 2

in f2 a: 1

nonlocal關鍵字

# 函數的外部必須已聲明變量

# nonlocal之前,函數内部不能出現同名變量

def f1():

    a = 1

    def f2():

        nonlocal a

        a = 2

    f2()

    print('in f1 a:', a)

f1()

in f1 a: 2
6、函數名的本質和閉包:閉包會一直存在記憶體當中,不會因為函數執行結束而被釋放
pythonTutor 程式設計線上視圖:http://pythontutor.com/visualize.html#mode=edit
用法 栗子 結果

函數名的本質

函數名被引用

# 函數名的本質就是函數的記憶體位址

def f1():

    print('Hello')

f = f1

print(f)

<function f1 at 0x00000202C6112E18>

函數名作為

容器類型的元素

def f2():

    print('This f2()')

def f3():

    print('This f3()')

l1 = [f2, f3]

d1 = {'a': f2, 'b': f3, }

# 調用

l1[1]()

d1['a']()

This f3()

This f2()

閉包函數的建立

借助函數名本質

def func():

    name = 'simba'

    def inner():

        print(name)

    return inner

f = func()

f()

simba
判斷是否為閉包函數

# 出的__closure__有cell元素 :是閉包函數

def func():

    name = 'simba'

    def inner():

        print(name)

    print(inner.__closure__)

    return inner

f = func()

f()

# 輸出的__closure__為None :不是閉包函數

def func2():

    def inner():

        name = 'Nala'

        print(name)

    print(inner.__closure__)

    return inner

f1 = func2()

f1()

“閉包”的作用——儲存函數的狀态資訊,使函數的局部變量資訊依然可以儲存下來

(<cell at 0x00000174FC8C76A8: str object at 0x00000174FE51E8B8>,)

simba

None

Nala

閉包的嵌套

def wrapper():

    age = 8

    def func():

        name = 'simba'

        def inner():

            print(name, 'age:%d' % age)

        return inner

    return func

f = wrapper()

i = f()

i()

simba age:8
閉包擷取網頁源碼

from urllib.request import urlopen

def index(url):

    def get():

        return urlopen(url).read()

    return get

# 傳回的是get函數的位址

python = index("http://www.python.org")

# 執行get函數《并且将傳回的結果列印出來

print(python()) 

 

願有更多的朋友,在網頁筆記結構上分享更邏輯和易讀的形式:

連結:暫無

提取碼:暫無

繼續閱讀