day10-函式的應用

weixin_34413065發表於2018-10-11

1.匿名函式

普通函式:
def 函式名(引數列表):
    函式體

匿名函式
函式名= lambada 引數列表:返回值

說明
函式名 -> 變數名
lambda -> 關鍵字
引數列表 -> 引數名1,引數名2......
返回值 -> 相當於只有一個return語句的函式體

匿名函式的呼叫和普通函式一樣:函式名(實參列表)
也支援位置引數、關鍵字引數、引數設定預設值、不定長引數

程式碼示例

# 寫一個匿名函式,功能是求兩個數的和
sum1 = lambda num1, num2: num1+num2

print(sum1(10, 20))
# 相當於上面的匿名函式
#  def  sum1(num1, num2)
#      return num1+num2

執行結果

30

練習:讀程式

程式碼如下

sum2 = lambda n: sum(range(1, n+1))
print(sum2(100))

執行結果

5050

練習:讀程式

程式碼示例

funcs = []
for item in range(1, 5):
    funcs.append(lambda x: x*item)

print(funcs[0](2))
print(funcs[1](2))

執行結果

8
8

2.變數的作用域

1.變數的作用域
變數的作用域指的是變數能夠使用的範圍

2.全域性變數和區域性變數
全域性變數:宣告在函式和類的外面的變數都是全域性變數;作用域是從宣告開始到整個py檔案結束
都可以使用

程式碼示例

# 全域性變數
a = 10

print('=====')
for x in range(5):
    print(a)
    print(x)


def fun1():
    print(a)


fun1()

# x, y, c都是全域性變數
for x in range(5):
    for y in range(2):
        c = 100

執行結果

10
0
10
1
10
2
10
3
10
4
10
3.區域性變數
宣告在函式和類中的變數。作用域是從宣告開始到整個函式結束 

程式碼示例

ef fun1():
    # 區域性變數
    aa = 100
    print(aa)
4.global關鍵字
在函式中說明一個變數是全域性變數

程式碼示例

name = 'abc'


def func2():
    global name  # 說明當前函式中使用的name是全域性變數name
    global age  # 宣告一個全域性變數
    age = 18
    name = 'aaa'
    print(name)


func2()
print(name)
print(age)

執行結果

aaa
aaa
18
5.nonlocal關鍵字
想要在區域性的區域性中修改區域性變數的值

程式碼示例

def func3():
    abc = 100

    def func4():
        nonlocal abc
        abc = 200
        print('f4', abc)
    func4()
    print('f3', abc)


func3()

執行結果

f4 200
f3 200

3.函式作為變數

宣告函式就是宣告一個型別是function的變數,函式名實質就是變數名

程式碼示例

def func1():
    print('=====')


print(type(func1))

執行結果

<class 'function'>
  • 1.變數可以給其他變數賦值

程式碼示例

a = 10
b = a
print(b*10)

list1 = [1, 2]
list2 = list1
list2.append(100)
print(list1)

# 宣告一個變數func2,型別為function
def func2():
    print('我是函式')


func1 = lambda x: print(x)
func3 = func1
func3(10)

a = func2
a()
# 將函式func2的返回值給b
b = func2()
print(b)

執行結果

100
[1, 2, 100]
10
我是函式
我是函式
None
  • 2.函式作為列表的元素

程式碼示例

a = 10
list1 = [1, a]
print(list1, list1[1] + 100)


def func22():
    print('我又是函式')
    return 10


list2 = [1, func22, func22()]
print(list2)

# list2[1]取到一個函式,通過後面加()呼叫函式
print(list2[1]())

執行結果

[1, 10] 110
我又是函式
[1, <function func22 at 0x00000285157D4AE8>, 10]
我又是函式
10
  • 3.將函式作為引數

程式碼示例

a = 10


def func1(n):
    print(n)


func1(a)


def func11(n):
    print('aaa')
    n()


def func12():
    print('hello world!')


func11(func12)

執行結果

10
aaa
hello world!

應用:sort的使用

列表.sort(key=None, reverse=False)
使用sort的時候,可以通過給key賦一個函式變數,來規定列表中的元素按照什麼標準來排序
這兒的函式變數要求要有一個引數和一個返回值。引數代表列表中的元素,返回值代表按照那個
標準排序

程式碼示例

list1 = [1, 45, 8, 89]
list1.sort()
print(list1)

list2 = [
    {'name': '張三', 'age': 20, 'score': 90},
    {'name': '李四', 'age': 28, 'score': 100},
    {'name': '王五', 'age': 18, 'score': 89}
]


def get_score(item):  # 根據成績排序
    return item['score']


list2.sort(key=get_score)
print(list2)

list3 = [
    ('a', 20),
    (10, 3),
    ('c', 90)
]


def get_2(item):
    return item[1]


list3.sort(key=get_2, reverse=True)
print(list3)

list3.sort(key=lambda item: item[1])
print(list3)

執行結果

[1, 8, 45, 89]
[{'name': '王五', 'age': 18, 'score': 89}, {'name': '張三', 'age': 20, 'score': 90}, {'name': '李四', 'age': 28, 'score': 100}]
[('c', 90), ('a', 20), (10, 3)]
[(10, 3), ('a', 20), ('c', 90)]
  • 4.將函式作為返回值

程式碼示例

def operation(operator: str):   # 根據運算子號,返回對應的功能
    if operator == "+":
        def func111(*args, **kwargs):
            sum1 = 0
            for item in args:
                sum1 += item
            for key in kwargs:
                sum1 += kwargs[key]
            return sum1
        return func111
    elif operator == "*":
        def func222(*args, **kwargs):
            sum1 = 1
            for item in args:
                sum1 *= item
            for key in kwargs:
                sum1 *= kwargs[key]
            return sum1
        return func222


print(operation('+')(90, 98))
print(operation('+')(90, 98, a=2))
print(operation('*')(10, 30, a=2))
print(operation('*')(10, 30, 30, 10))

執行結果

188
190
600
90000

4.函式的呼叫

1.補充:python中的函式可以有多個返回值

程式碼示例

# 求多個數的和以及平均值


def yt_sum(*nums):
    sum1 = sum(nums)
    average = sum1 / len(nums)
    return sum1, average


a, b = yt_sum(2, 56, 78, 65, 6)
num = yt_sum(2, 56, 78, 65, 6)
print(a, b)
print(num[0], num[1])

執行結果

207 41.4
207 41.4
2.函式的呼叫是一個壓棧的過程

每次呼叫函式的時候,系統都會在記憶體中(棧)開闢空間來儲存函式執行過程中產生的資料
(函式中宣告的變數)。
當函式呼叫完成後,這塊記憶體會自動銷燬

5.遞迴函式(瞭解)

遞迴函式:函式中呼叫函式本身,這樣的函式就是遞迴函式(自己呼叫自己)

迴圈能做的事情遞迴都可以做,但是實際迴圈能解決的問題絕對不選遞迴

程式碼示例

def func1():
    print('=====')
    func1()
怎麼些遞迴函式
第一步:確定臨界值(迴圈結束的條件),讓函式結束
第一步:找關係,假設函式的功能已經實現,找f(n)和f(n-1)的關係
第三部:根據關係,用f(n-1)實現f(n)的功能

程式碼示例

# 寫一個遞迴函式,實現:1+2+3+.....n


def yt_sun(n):
    # 1.找臨界值
    if n == 1:
        return 1
    # 2.找關係
    """
    yt_sum(n) = 1+2+3+...+n
    yt_sum(n-1) = 1+2+3+...+n-1
    yt_sum(n) = yt_sum(n-1)+n
    """
    return yt_sun(n-1) + n


print(yt_sun(100))

# 用遞迴實現一下功能
"""
n = 3
***
**
*

n = 4
****
***
**
*

......
"""


def print_star(n):
    if n == 1:
        print('*')
        return
    print('*'*n)
    print_star(n-1)


print_star(5)

"""
n = 3
*
**
***
.....
"""


def print_star(n):
    if n == 1:
        print('*')
        return
    print_star(n - 1)
    print('*' * n)



print_star(3)

執行結果

5050
*****
****
***
**
*
*
**
***

總結:能不用就不用

相關文章