day11_總結(jié)

01-函數(shù)作為變量

1.函數(shù)調(diào)用表達式

1)函數(shù)調(diào)用表達式 - 調(diào)用函數(shù)的語句
2)普通值能做的事情函數(shù)調(diào)用表達式都可以做

def func1(x):
    return x**3


def func2(t):
    print('====:', t)
    return func1(2)


8
func1(2)

num = 8
num1 = func1(2)
print(num, num1)

num = 8 * 2
num1 = func1(2) * 2
print(num, num1)

list1 = [8, 10]
list2 = [func1(2), 10]
print(list1, list2)


func2(8)
func2(func1(2))

if 8 % 2 == 0:
    print('偶數(shù)')

if func1(2) % 2 == 0:
    print('偶數(shù)')


def func3(num1):
    return str(num1)+'abc'


print(func3(100)[-1])
print(func3(213)[2:])
print(func3(123).upper())

2.函數(shù)作為變量

1)python中聲明函數(shù)本質(zhì)就是聲明一個類型是function的變量,函數(shù)名就是變量名,變量能做的事情,函數(shù)都可以做

1.1)聲明一個類型是function的變量, func4是變量

def func4(x):
    print('函數(shù):', x)


a = 10
print(type(a), type(func4))

1.2)一個變量可以給另外一個變量賦值

print('================給變量賦值===============')
b = a
print(b+20)

c = func4
print(c(100))

1.3)給變量重新賦值

a = 'abc'
print(a)

func4 = 321
print(func4*2)
# func4(3)     # TypeError: 'int' object is not callable

1.4)變量作為容器的元素

a = 10
list1 = [a, 10]
print(list1[0]/2)


def func4(x):
    print('函數(shù):', x)


list1 = [func4, func4(20)]
print(list1[1])
print(list1[0](9))   # print(func4(9))


list1 = [
    {'a': 10, 'f': func4},
    100
]
print(list1[0]['f'](100))    # func4(100)


def func5():
    return [1, 2, 3]


list1 = [
    {'a': 10, 'f': func5},
    100
]
print(list1[0]['f']()[1])   # [1, 2, 3][1]

1.5)變量可以作為函數(shù)的參數(shù)
a.一個函數(shù)可以作為另外一個函數(shù)的參數(shù)
b.如果一個函數(shù)的參數(shù)也是函數(shù),那么這種函數(shù)叫實參高階函數(shù)

def func61(a=0):
    return a*2


# 參數(shù)x的類型必須是函數(shù)
def func6(x):
    # x = func61
    x()    # x()是調(diào)用函數(shù)的語句; func61()


func6(func61)


def func7(x):
    return x(10) + 100   # x是函數(shù),并且能夠接收一個參數(shù),返回值是數(shù)字

3.實參高階函數(shù): 列表.sort()、sorted()、max(), min()

nums = [1, 78, 9, 78, 67, 100]
print(nums.sort())
print(nums)


nums = (1, 78, 9, 78, 67, 100)
print(sorted(nums))
print(nums)

3.1)sort和sorted
a.這兩個函數(shù)是實參高階函數(shù),里面有個參數(shù)key要求傳一個函數(shù)
b.key參數(shù)對應(yīng)的函數(shù)是用來決定排序規(guī)則: 函數(shù)需要一個參數(shù)和一個返回值, 它的參數(shù)代表需要排序的序列的元素,返回值是比較對象
c.數(shù)字列表, 排序規(guī)則發(fā)生改變: 按照數(shù)字的個位數(shù)從小到大排序

nums = [21, 69, 367, 78, 478, 5100]

# key對應(yīng)的函數(shù)1: 按照元素本身大小進行排序
# [21, 69, 367, 78, 478, 5100]
def func(item):
    return item


# key對應(yīng)的函數(shù)2: 按照 元素%10 的值的大小進行排序
def func1(item):
    return item % 10


# key對應(yīng)的函數(shù)3:按照元素的最高位的值進行從小到大排序
def func2(item):
    return int(str(item)[0])


nums.sort(key=func2)    # 按照元素本身大小進行排序
print(nums)

練習(xí): 給一個數(shù)字列表,按照各位數(shù)的和的大小從下到大排序

nums = [12, 67, 18, 90, 890, 123, 99]    # [3, 13, 9, 9, 17, 6, 18]
# nums = [12, 123, 18, 90, 67, 890, 99]


def func3(item):
    sum1 = 0
    for ch in str(item):
        sum1 += int(ch)
    return sum1


nums.sort(key=func3)
print(nums)

練習(xí):

all_students = [
    {'name': '小明1', 'age': 23, 'score': 89, 'id': 'stu001'},
    {'name': '小明2', 'age': 30, 'score': 70, 'id': 'stu029'},
    {'name': '小明3', 'age': 18, 'score': 99, 'id': 'stu010'},
    {'name': '小明4', 'age': 21, 'score': 40, 'id': 'stu004'},
]


def func4(item):
    return item['score']


all_students.sort(key=func4, reverse=True)
print(all_students)

nums = [12, 39, 56]
print(max(nums, key=lambda item: item % 10))


print(max(all_students, key=lambda item: item['score']))

print(max([1, 78, 9]))
print(max({90, 9, 100, 89}))
# print(max(all_students))   # TypeError: '>' not supported between instances of 'dict' and 'dict'
# print(max(all_students, key=10))   # TypeError: 'int' object is not callable
print(max(all_students, key=lambda x: x['score']))

實現(xiàn)原理(了解!)

def yt_max(seq, key=None):
    seq = list(seq)
    if not key:
        max1 = seq[0]
        for x in seq[1:]:
            if x > max1:
                max1 = x
        return max1

    # key存在
    max1 = seq[0]
    for x in seq[1:]:
        if key(x) > key(max1):
            max1 = x
    return max1


print(yt_max([1, 78, 9]))
print(yt_max({90, 9, 100, 89}))
# print(yt_max(all_students))    # TypeError: '>' not supported between instances of 'dict' and 'dict'
# print(yt_max(all_students, key=10))   # TypeError: 'int' object is not callable
print(yt_max(all_students, key=lambda x: x['score']))

4.變量作為函數(shù)的返回值

4.1)一個函數(shù)的返回值如果也是一個函數(shù),那么這個函數(shù)就是返回值高階函數(shù)

# func1是返回值高階函數(shù),因為它的返回值是一個函數(shù)
def func1():
    def func11():
        return 10

    return func11


f = func1()
print(f())   # print(func11())  print(10)
f()


def operation(symbol):
    if symbol == '+':
        def sum(*num):
            sum1= 0
            for x in num:
                sum1 += x
            return sum1
        return sum
    elif symbol == '-':
        def differ(*num):
            sum1 = num[0]
            for x in num[1:]:
                sum1 -= x
            return sum1
        return differ


print(operation('+')(1, 2, 3, 9))
print(operation('-')(1, 2, 4))

5.****裝飾器! = 實參高階函數(shù)+返回值高階函數(shù)+函數(shù)+糖語法

02-迭代器

1.什么是迭代器(iter)

a.迭代器是容器型數(shù)據(jù)類型(序列), 可變(不支持增刪改),有序(不支持下標(biāo)操作)
b.保存在迭代器中的元素,只能取,并且取出后迭代器中就不再保存,也不可以再往迭代器中添加元素

c.迭代器沒有對應(yīng)的格式的數(shù)據(jù), 迭代器只能是通過將其他的序列轉(zhuǎn)換成迭代器,或者是生成器

iter1 = iter([10, 20, 30])
print(iter1)

iter2 = iter('hello')
print(iter2)

2.獲取迭代器中的元素

a.不管用什么樣的方式去獲取迭代器中的元素, 獲取一個就會少一個

  1. 獲取單個元素: next(迭代器) - 獲取迭代器頂部的元素(最上層/第一個元素)
print(next(iter2))    # h
print(next(iter2))    # e
print(next(iter2))    # l
print(next(iter2))    # l
print(next(iter2))    # o
# print(next(iter2))  # 報錯, StopIteration
  1. 遍歷
iter2 = iter('abc123')
print(next(iter2))    # a
print(next(iter2))    # b
for x in iter2:
    print('===:', x)
# print(next(iter2))    # StopIteration

03-生成器

1.什么是生成器

a.生成器就是迭代器 - 獲取元素和迭代器一樣(只能一個一個的取,取一個少一個)
b.調(diào)用函數(shù)體中有yield關(guān)鍵字的函數(shù),就可以得到一個生成器

2.yield

a.yield只能出現(xiàn)在函數(shù)體中
b.調(diào)用有yield關(guān)鍵字的函數(shù), 不會執(zhí)行函數(shù)體,也不會獲取返回值。而是得到一個生成器

def func1():
    print('我是一個函數(shù)')
    return 100
    yield


print(func1())

3.生成器怎么產(chǎn)生數(shù)據(jù)

a.看一個生成器能夠產(chǎn)生幾個數(shù)據(jù),看執(zhí)行完生成器對應(yīng)的函數(shù)會遇到幾次yield;yield后面的值就是生成器能產(chǎn)生數(shù)據(jù)

def func2():
    for x in range(10):
        yield x


gen1 = func2()
print(gen1)
print(next(gen1))
print(next(gen1))
for x in gen1:
    print('==:', x)

4.生成器生成數(shù)據(jù)的原理

a.生成器不會同時將所有的元素保存起來, 而是需要數(shù)據(jù)的時候臨時產(chǎn)生數(shù)據(jù)。

b.獲取生成器元素的時候,就去執(zhí)行生成器對應(yīng)的函數(shù)的函數(shù)體,從前往后執(zhí)行,
直到遇到y(tǒng)ield為止, 并且將yield后面的值作為結(jié)果,同時保存結(jié)束位置;
下次獲取下一個元素的時候,接著上次結(jié)束的位置往后執(zhí)行,直到遇到下一個yield;
以此類推...
如果執(zhí)行到函數(shù)結(jié)束都沒有遇到y(tǒng)ield, next函數(shù)會報StopIteration錯誤

print('=================================')


def func3():
    print('start')
    print('======第一個數(shù)據(jù)=====')
    yield 1
    print('======第二個數(shù)據(jù)======')
    yield 2
    print('======第三個數(shù)據(jù)=====')
    yield 3
    print('end')


gen2 = func3()
print(next(gen2))
print('開始取第2個數(shù)據(jù):')
print(next(gen2))
print('開始取第3個數(shù)據(jù):')
print(next(gen2))
# print(next(gen2))     # StopIteration


def func2():
    print('===============')
    yield
    print('+++++++++++++++')
    yield


def func3():
    print('1111111111111111')
    yield
    print('2222222222222222')
    yield


gen3 = func2()
gen4 = func3()

next(gen3)
next(gen4)
next(gen3)
next(gen4)

寫一個產(chǎn)生學(xué)號的生成器

def creat_id():
    num = 1
    while True:
        yield 'stu'+str(num)
        num += 1


nums = creat_id()
print(next(nums))
print(next(nums))

for _ in range(100):
    print('===:', next(nums))

print(next(nums))


def func4():

    yield 1
    return 10
    yield 2
    yield 3


gen5 = func4()
print(next(gen5))
# print(next(gen5))   # StopIteration: 10

04-生成式

1.什么是生成式

a.生成式本質(zhì)就是生成器

1)語法1
(表達式 for 變量 in 序列) - 創(chuàng)建一個生成器

展開成生成器:
def func1():
for 變量 in 序列:
yield 表達式

[表達式 for 變量 in 序列] - 將聲稱是對應(yīng)的生生成器轉(zhuǎn)換成列表

2)語法2
(表達式 for 變量 in 序列 if 條件語句) - 創(chuàng)建一個生成器
展開成生成器:
def func1():
??for 變量 in 序列:
???? if 條件語句:
???????yield 表達式

gen1 = (x*2 for x in range(10))
print(next(gen1))
print(next(gen1))

list1 = list(gen1)
print(list1)        #[4,6,8,10···18]

# print(next(gen1))         # StopIteration
def func():
    for x in range(10):
    yield  x*2
gen1 = func()


list2 = [x*x for x in range(1,10)]
print(list2)        # [1,4,9,16,25,36,49,64,81]

list3 = list((x*x) for x in range(1,10))
print(list3)        # [1,4,9,16,25,36,49,64,81]

dict1 = dict((x,x*2)for x in range(5))
# (0,0),(1,2),(2,4),(3,6),(4,8)
print(dict1)    # {(0,0),(1,2),(2,4),(3,6),(4,8)}

list4 = ["stu"+str(x) for x in range(10) if x % 2 ]
print(list4)    #["stu1","stu3","stu5","stu7","stu9"]

list5 = ["%d*2=%d" % (x,x*2) for x in range(5)]
print(list5)

05-模塊的使用

a.在實際開發(fā)的時候,一個項目會分為多個模塊

1.什么是模塊:一個py文件就是一個模塊

2.多模塊怎么協(xié)作: 導(dǎo)入模塊

  1. import 模塊名 - 在當(dāng)前模塊中導(dǎo)入指定模塊,導(dǎo)入后可以使用指定模塊中所有的全局變量
    以'模塊名.變量'的方式去使用

  2. from 模塊名 import 全局變量1,全局變量2,...
    - 導(dǎo)入指定模塊中指定的全局變量; 被導(dǎo)入的全局變量在當(dāng)前模塊中直接使用

3)重命名
import 模塊名 as 新模塊名 - 模塊重命名,通過新模塊名去使用模塊
from 模塊名 import 變量1 as 新變量1, 變量2 as 新變量2,...
變量重命名,通過新變量去使用變量

  1. 通配符
    from 模塊名 import * - 導(dǎo)入模塊中所有的全局變量,使用的時候直接用

導(dǎo)入方式一:

 import login

login.login()
print(login.num)
print(login.text)
print(login.x)

導(dǎo)入方式二:

from login import login, num
login()
print(num)
# # print(text)     # NameError: name 'text' is not defined
# # print(login.text)   # AttributeError: 'function' object has no attribute 'text'

模塊重命名

import login as loginModule
login = True
# print(login.num)   # AttributeError: 'bool' object has no attribute 'num'
print(loginModule.num)

# from login import login, num as lg_num
# num = 123
# print(num, lg_num)   # 123 100
#
# login()

通配符

from login import *
print(num, x, text)
login()

3.導(dǎo)入模塊的原理

a.當(dāng)執(zhí)行導(dǎo)入模塊的代碼的時候,實質(zhì)會執(zhí)行被導(dǎo)入的模塊對應(yīng)的py文件

print('06模塊中的name:', __name__)

# import login
from login import num

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

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

  • 1.函數(shù)調(diào)用表達式:調(diào)用函數(shù)的語句 普通值能做的事情函數(shù)調(diào)用表達式都能做 2.函數(shù)作為變量 !python中聲明函...
    itachhh閱讀 270評論 0 0
  • 一.函數(shù)作為變量 1.函數(shù)調(diào)用表達式 函數(shù)調(diào)用表達式 - 調(diào)用函數(shù)的語句普通值能做的事,函數(shù)調(diào)用表達式都可以做 2...
    SheeranED閱讀 180評論 0 0
  • 遞歸函數(shù) 1.什么是遞歸?在函數(shù)中調(diào)用本身的函數(shù)被稱為遞歸函數(shù) 2.遞歸的作用:循環(huán)可以做的事情遞歸函數(shù)都可以做,...
    xue_y閱讀 155評論 0 0
  • 文件的操作 1.模塊的使用 1.導(dǎo)入模塊Python中一個py文件就是一個模塊,可以通過import或者form-...
    hfudhu閱讀 290評論 0 0
  • 01.recode 1.容器類數(shù)據(jù)類型 a.列表:可變,有序b.元祖:x, y = 12, 100; x, *n...
    Gary134閱讀 271評論 0 0

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