[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、命名空間和作用域
命名空間的本質:存放名字與值的綁定關係
三種命名空間的加載順序:內置命名空間(程序運行前加載)->全局命名空間(程序運行中:從上到下加載)->局部命名空間(程序運行中:調用時才加載)
作用域:作用範圍,按照生效範圍可以分爲全局作用域和局部作用域;
全局作用域:包含內置名稱空間、全局名稱空間,在整個文件的任意位置都能被引用、全局有效
局部作用域:局部名稱空間,只能在局部範圍生效
     
用法 栗子 結果
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()) 
 

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

鏈接:暫無
提取碼:暫無

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