day11、函數(shù)的應(yīng)用第二彈 2019-01-07

一、復(fù)習(xí)

1.函數(shù)的聲明

def 函數(shù)名(參數(shù)列表):
函數(shù)體

lambda 參數(shù)列表: 返回值

(重點(diǎn))函數(shù)聲明的時(shí)候函數(shù)體不會(huì)執(zhí)行!

2.函數(shù)調(diào)用

函數(shù)名() <---> 變量() - 要求變量中存儲(chǔ)的地址對(duì)應(yīng)的值是function

調(diào)用過(guò)程:
回到函數(shù)聲明的位置
傳參 - 保證每個(gè)參數(shù)都有值
執(zhí)行函數(shù)體
確定返回值
回到函數(shù)調(diào)用的位置

3.函數(shù)的參數(shù)

位置參數(shù)和關(guān)鍵參數(shù)
參數(shù)默認(rèn)值
參數(shù)類(lèi)型說(shuō)明
不定長(zhǎng)參數(shù)

4.返回值

怎么確定函數(shù)的返回值
怎么獲取函數(shù)的返回值 - 函數(shù)調(diào)用表達(dá)式

5.全局變量和局部變量

6.函數(shù)作為量: 聲明函數(shù)就是聲明一個(gè)類(lèi)型是function的變量,函數(shù)名就是變量名

例如:

def func1():
    return 10


a = 10
# func1和a是一樣的,都是變量

print(a - 1)
print(func1())

a = [1, 2]
print(a[0])

func1 = 'abc'
print(func1[0])

# lambda x: x 和  10是一樣的,都是值
num = 10
list1 = [10]

func2 = lambda x: x
list2 = [lambda x: x]

func2(10)
list2[0]('abc')


def yt_sums(*num):
    """求多個(gè)數(shù)的和"""
    # num = (1, 2, 3, 4)
    sum1 = 0
    for x in num:
        sum1 += x
    return sum1


def yt_product(*num):
    sum1 = 1
    for x in num:
        sum1 *= x
    return sum1


# print(yt_sums(1, 2, 3))
# print(yt_product(2, 4, 6))


def opration(char: str, *nums):
    # char = '+', nums = (1, 2, 3, 4)  *nums 相當(dāng)于 1, 2, 3, 4
    if char == '+':
        return yt_sums(*nums)  # yt_sums(1,2,3,4)
    else:
        return yt_product(*nums)


print(opration('+', 1, 2, 3, 4))
print(opration('*', 1, 2, 3, 4))

運(yùn)行結(jié)果:

9
10
1
a
10
24

二、遞歸函數(shù)

實(shí)際開(kāi)發(fā)的時(shí)候,能不用遞歸就不用

1.什么是遞歸函數(shù)

函數(shù)中調(diào)用函數(shù)本身的函數(shù)就是遞歸函數(shù)

2.遞歸的作用:循環(huán)能做的事情遞歸函數(shù)都能做

例如:

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


a = 0

def func2():
    global a
    if a < 5:
        print('~~~~~')
        a += 1
        func2()

func2()

運(yùn)行結(jié)果:

~~~~~
~~~~~
~~~~~
~~~~~
~~~~~

3.怎么寫(xiě)遞歸函數(shù):f(n)

第一步:確定臨界值 - 循環(huán)結(jié)束的條件,在臨界值的地方要讓函數(shù)結(jié)束!
第二步:找關(guān)系 - 找當(dāng)次循環(huán)和上次循環(huán)的關(guān)系;
找f(n)和f(n-1)的關(guān)系
第三步: 假設(shè)函數(shù)f的功能已經(jīng)實(shí)現(xiàn),通過(guò)f(n-1)來(lái)實(shí)現(xiàn)f(n)的功能

例如:

# 實(shí)現(xiàn):1+2+3+...+n
# a.for循環(huán)
# n = 20
# # sum1 = 0
# # for x in range(n+1):
# #     sum1 += x
# # print(sum1)


# b.遞歸
def yt_sum(n):
    # 1.找臨界值
    if n == 1:
        return 1

    # 2. 找關(guān)系
    """
    找yt_sum(n)和yt_sum(n-1)的關(guān)系
    yt_sum(n): 1+2+3+...+n-1+n
    yt_sum(n-1): 1+2+3+...n-1
    yt_sum(n) = yt_sum(n-1)+n
    """
    return yt_sum(n-1)+n

print(yt_sum(4))
print(yt_sum(100))

運(yùn)行結(jié)果:

10
5050

練習(xí): 求斐波那契數(shù)列第n個(gè)數(shù)

ef sequence(n):
    # 1.找臨界值
    if n == 1 or n == 2:
        return 1
    # 2. f(n)和f(n-1)
    """
    f(n) = f(n-1)+f(n-2)
    """
    return sequence(n-1)+sequence(n-2)


print(sequence(5))

運(yùn)行結(jié)果

5

4.循環(huán)能做的事情不能使用遞歸做!

例如:

sum1 = 0
for x in range(10001):
    sum1 += x
print(sum1)


def yt_sum(n):
    if n == 1:
        return 1
    return yt_sum(n-1)+n


print(yt_sum(100))

運(yùn)行結(jié)果:

50005000
5050

三、模塊

1.什么是模塊

在python中一個(gè)py文件就是一個(gè)模塊

a.系統(tǒng)模塊(標(biāo)準(zhǔn)庫(kù)) - python系統(tǒng)提供的模塊(安裝解釋器的時(shí)候已經(jīng)導(dǎo)入到解釋器中了,使用的時(shí)候在代碼中直接導(dǎo)入)

random模塊 - 提供隨機(jī)數(shù)
math模塊 - 提供數(shù)學(xué)運(yùn)算
json庫(kù) - 提供json數(shù)據(jù)相關(guān)操作
re模塊 - 提供正則表達(dá)式相關(guān)操作
socket模塊 - 提供python套接字編程
time模塊 - 提供和時(shí)間相關(guān)的操作
threading模塊 - 提供和線程相關(guān)的操作
...

b.自定義模塊 - 程序員自己創(chuàng)建的py文件

自己寫(xiě)的模塊
別人寫(xiě)的模塊 - 第三方庫(kù) (需要先下載到解釋器中,然后才能再代碼中導(dǎo)入)

標(biāo)準(zhǔn)庫(kù)和第三庫(kù)一般是通過(guò)模塊提供變量、函數(shù)、類(lèi)

2.怎么使用模塊

import 模塊名 - 在程序中直接導(dǎo)入指定的模塊, 導(dǎo)入后可以使用模塊中所有的全局變量(包含了變量、函數(shù)和類(lèi))
導(dǎo)入后通過(guò)"模塊名.變量"來(lái)使用模塊中的內(nèi)容

from 模塊名 import 變量1, 變量2 - 在程序中導(dǎo)入指定的模塊,導(dǎo)入后只能使用import后面的變量
導(dǎo)入后直接使用變量,不用在前面加'模塊名.'

from 模塊名 import * - 在程序中直接導(dǎo)入指定的模塊, 導(dǎo)入后可以使用模塊中所有的全局變量(包含了變量、函數(shù)和類(lèi))
導(dǎo)入后直接使用變量,不用在前面加'模塊名.'

3.導(dǎo)入模塊的實(shí)質(zhì)

a.不管是使用 import 還是 from-import ,導(dǎo)入模塊的時(shí)候都會(huì)執(zhí)行模塊中的所有代碼
b.python中,一個(gè)模塊不會(huì)重復(fù)導(dǎo)入多次。因?yàn)閷?dǎo)入的時(shí)候系統(tǒng)會(huì)自動(dòng)檢查之前有沒(méi)有導(dǎo)入這個(gè)模塊

4.怎么阻止模塊中的內(nèi)容被其它模塊執(zhí)行

將不希望被其它模塊執(zhí)行的代碼放在 if 語(yǔ)句中,如果希望被其它模塊使用的代碼就放在 if 語(yǔ)句代碼外
寫(xiě)在這個(gè) if 語(yǔ)句中的代碼不會(huì)被別的模塊執(zhí)行:

if __name__ == '__main__':
    main()

原理:每個(gè)模塊都有一個(gè) name 屬性,代表模塊名。默認(rèn)情況下它的值是 py 文件的文件名。
當(dāng)前模塊正在被執(zhí)行()的時(shí)候,

5.重命名

導(dǎo)入模塊的時(shí)候,可以對(duì)模塊或者模塊中的內(nèi)容重新命名。
import 模塊名 as 新模塊名
from 模塊名 import 變量名1 as 新變量名2, 變量名2 as 新變量名2

四、迭代器

1.什么是迭代器(iter)

是python提供的容器型數(shù)據(jù)類(lèi)型
獲取迭代器中的元素的時(shí)候,只能從前往后一個(gè)一個(gè)的取,而且取了之后這個(gè)元素在迭代器中就不存在了。

2.迭代器的字面量

迭代器沒(méi)有指定格式的字面量,迭代器作為容器,里面的元素只能通過(guò)其他序列轉(zhuǎn)換而成,或者通過(guò)生成器生成。
迭代器里面的數(shù)據(jù)可以是任何數(shù)據(jù)類(lèi)型。

iter1 = iter('halo') -----將字符串轉(zhuǎn)換成迭代器,迭代器中的元素就是字符串中的每個(gè)元素
iter2 = iter([123, 'adc'], (10, 20), [30, 40]) -----將列表轉(zhuǎn)換成迭代器,迭代器里面的元素就是列表里面的所有元素。

3.獲取元素

迭代器里面的元素只支持查,不支持增刪改。
迭代器只能通過(guò) next 函數(shù)獲取單個(gè)元素,或者通過(guò) for-in 遍歷,一個(gè)一個(gè)獲取每一個(gè)元素。
已經(jīng)獲取過(guò)的元素,在迭代器里面就不存在了。

a.

next(迭代器) -----獲取迭代器里最新(頂層)的數(shù)據(jù)
如果取完了迭代器里面的數(shù)據(jù)后還取,會(huì)報(bào)錯(cuò)。

b.

for i in 迭代器:
print(i)
效果和 next 效果一樣,元素還會(huì)從迭代器中取出。

五、生成器

1.什么是生成器

生成器就是迭代器,迭代器不一定是生成器。

2.生成器怎么產(chǎn)生元素

調(diào)用一個(gè)帶有 yield 關(guān)鍵字的函數(shù),就能得到一個(gè)生成器。
例如:

# 不帶 yield 的函數(shù),調(diào)用的時(shí)候,會(huì)執(zhí)行函數(shù)體,并且獲取返回值。
def func1():
    print('===')
    return 100


print(func1)


# 帶 yield 的函數(shù),調(diào)用的時(shí)候,不會(huì)執(zhí)行函數(shù)體,也不會(huì)獲取返回值,而是生成一個(gè)生成器(函數(shù)調(diào)用表達(dá)式就是一個(gè)生成器)。
# 這個(gè)生成器中的元素就是 yield 關(guān)鍵字后面的值(元素)
def func2():
    print('===')
    return 100
    yield


print(func2)

運(yùn)行結(jié)果:

===
100
<generator object func2 at 0x000001350B0A5938>

3.生成器的元素

生成器中的元素也是通過(guò) next 或者 for-in
生成器獲取元素的時(shí)候,實(shí)質(zhì)就是去執(zhí)行生成器對(duì)應(yīng)的函數(shù),每次執(zhí)行到 yield 語(yǔ)句為止,
并且會(huì)將 yield 后面的值作為當(dāng)次獲取到的元素, 保留當(dāng)次執(zhí)行到 yield 的位置。
下次獲取元素的時(shí)候,會(huì)接著上層結(jié)束的位置,往后執(zhí)行,直到遇到下個(gè) yield 為止。以此類(lèi)推,直到函數(shù)結(jié)束。
如果執(zhí)行到函數(shù)結(jié)束都沒(méi)有遇到 yield 那么就會(huì)報(bào)‘stopiterator’錯(cuò)誤。
例如:

def func3():
    print('…………')
    yield 1000
    print('!!!!!!')
    yield 100


gen1 = func3()              # gen1 就是一個(gè)生成器
print(gen1)
print('打印', next(gen1))
print('打印', next(gen1))

運(yùn)行結(jié)果:

<generator object func3 at 0x000001350B0A5938>
…………
打印 1000
!!!!!!
打印 100

例如:


運(yùn)行結(jié)果:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 〇、前言 本文共108張圖,流量黨請(qǐng)慎重! 歷時(shí)1個(gè)半月,我把自己學(xué)習(xí)Python基礎(chǔ)知識(shí)的框架詳細(xì)梳理了一遍。 ...
    Raxxie閱讀 19,582評(píng)論 17 410
  • 函數(shù)的復(fù)習(xí)"""1.函數(shù)的聲明def 函數(shù)名(參數(shù)列表):函數(shù)體函數(shù)名就是變量名。 上面整個(gè)是聲明一個(gè)變...
    遙遠(yuǎn)的她197閱讀 239評(píng)論 0 0
  • 一:遞歸函數(shù) 實(shí)際開(kāi)發(fā)的時(shí)候,能不用遞歸就不用。 1.什么是遞歸函數(shù) 在函數(shù)中調(diào)用函數(shù)本身的函數(shù)就是遞歸函數(shù)。 2...
    生命的怒放閱讀 564評(píng)論 0 0
  • 是世界臟了,還是我臟了,在旁人的言語(yǔ)中,模糊了自己,忘記了本性,忘記了從前,也迷失了自我,在旁人的言論中,沉淪.沉...
    夜九逍閱讀 394評(píng)論 0 1
  • 暖風(fēng)涼涼一陣意愛(ài)已熄,在或不在隔離掛于心信奉的天長(zhǎng)地久如夢(mèng)幻初醒未醒永沉寂 一場(chǎng)往來(lái)無(wú)常的筵席你若即若離曾來(lái)過(guò)留下...
    花非物欲閱讀 378評(píng)論 2 9

友情鏈接更多精彩內(nèi)容