主頁 > 後端開發 > python函式

python函式

2022-02-20 06:42:12 後端開發

函式

概念:功能 (包裹一部分代碼 實作某一個功能 達成某一個目的)
特點:可以反復呼叫,提高代碼的復用性,提高開發效率,便于維護管理

 

1.函式基本格式

# 定義一個函式
def 函式名():
code1
code 

# 呼叫函式
函式名()
"""

# 定義函式
def func():
print("我是一個函式 ... ")

# 呼叫函式
func()

 

 

2.函式的命名

字母數字下劃線,首字符不能為數字
嚴格區分大小寫,且不能使用關鍵字
函式命名有意義,且不能使用中文哦

駝峰命名法:
(1) 大駝峰命名法: 每個單詞的首字符要大寫 (類的命名)
mycar => MyCar
(2) 小駝峰命名法: 除了第一個單詞首字符小寫外,剩下單詞首字符大寫 (函式或者變數)
mycar => myCar
(3)_命名法:可以將不同的單詞用_拼接在一起
mycar => my_car
symmetric_differencesymmetricDifference SymmetricDifference

# 函式定義
def cfb_99():
for i in range(1,10):
for j in range(1,i+1):
print("{:d}*{:d}={:2d} ".format(i,j,i*j) ,end="")
print()
# 呼叫函式
for i in range(5):
cfb_99()

 

函式的引數

引數: 函式運算時需要的值

引數種類:
(1)形參: 形式引數,在函式的定義處
(2)實參: 實際引數,在函式的呼叫處

形參的種類:
1.普通形參(位置形參) 2.默認形參 3普通收集形參 4.命名關鍵字形參 5.關鍵字收集形參
實參的種類:
1.普通實參 2.關鍵字實參

原則:
形參和實參要一一的對應

 

1.普通形參(位置形參)

# 定義函式
"""hang,lie普通形參,在函式定義處"""
def small_star(hang,lie):
i = 0
while i < hang:
j = 0
while j < lie:
print("*",end="")
j +=1
print()
i += 1
# 呼叫函式
"""10,10普通實參,在函式的呼叫處"""
small_star(10,10)
small_star(2,3)

 

2.默認形參

"""hang,lie默認形參,在函式定義處"""
"""
如果給予實參,那么使用實參
如果沒有給予實參,那么使用引數身上的默認值
"""
def small_star(hang=10,lie=10):
i = 0
while i < hang:
j = 0
while j < lie:
print("*",end="")
j +=1
print()
i += 1

small_star(4,8)
small_star(8)
small_star()

 

3.普通形參 + 默認形參

"""普通形參必須寫在默認形參的前面不能調換位置"""
def small_star(hang,lie=10):
i = 0
while i < hang:
j = 0
while j < lie:
print("*",end="")
j +=1
print()
i += 1
small_star(5,7)
# small_star(5)
# small_star() error

 

4.關鍵字實參


1.如果都是關鍵字實參,可以任意調整實參的順序
2.普通實參必須寫在關鍵字實參的前面

def small_star(hang,a,b,c,lie=10):
i = 0
while i < hang:
j = 0
while j < lie:
print("*",end="")
j +=1
print()
i += 1

# hang a ... lie 具體指定引數的值叫做關鍵字實參,在函式的呼叫處;
# small_star(hang=3,a=4,b=5,c=6,lie=7)
# small_star(b=5,c=6,lie=7,a=4,hang=3)
small_star(3,4,b=5,c=6,lie=7)
small_star(3,4,b=5,lie=7,c=6)
# small_star(b=5,c=6,lie=7,3,4) error

 

 

 

 

 

 

 收集引數

 

(1) 普通收集形參

專門用來收集那些多余的沒人要的普通實參 收集之后,會把多余實參打包成一個元組 引數頭上1個星星

def func(*args):
  pass
args => arguments

def func(a,b,c,*args):
    print(a,b,c) # 1 2 3
    print(args)  # (4,5,6)

func(1,2,3,4,5,6)


# 任意個數值得累加和
def mysum(*args):
    total = 0
    for i in args:
        total += i
    print(total)
mysum(1,2,3,4,4,45,10,100)

 

 

(2) 關鍵字收集形參

專門用來收集那些多余的沒人要的關鍵字實參收集之后,會把多余關鍵字實參打包成一個字典,引數頭上有2個星星

def func(**kwargs):

  pass
kwargs => keyword arguments

 

def func(a,b,c,**kwargs):
    print(a,b,c)
    print(kwargs) # {'f': 100, 'e': 200, 'z': 12}
func(c=1,a=3,b=10,f=100,e=200,z=12)

 

 

拼接任意個數值變成字串


"""
班長: 趙萬里
班花: 馬春陪
劃水群眾: 趙沈陽,李虎凌,劉子濤
"""
def func(**kwargs):
strvar1 = ""
strvar2 = ""
# 定義職位資訊
dic = {"monitor":"班長","classflower":"班花"}
print(kwargs)
# 共5次回圈
for k,v in kwargs.items():
if k in dic:
# 將2次回圈的結果通過+= 拼接在一起
strvar1 += dic[k] + ":" + v + "\n"
else:
# 將3次回圈的結果通過+= 拼接在一起
strvar2 += v + " , "
print(strvar1.strip())
print("劃水群眾:",strvar2.strip(" , "))

"""
# print(k,v)
k v
monitor 趙萬里
classflower 馬春陪
water1 趙沈陽
water2 李虎凌
water3 劉子濤
{'monitor': '趙萬里', 'classflower': '馬春陪', 'water1': '趙沈陽', 'water2': '李虎凌', 'water3': '劉子濤'}
"""

func(monitor="趙萬里",classflower="馬春陪",water1="趙沈陽",water2="李虎凌",water3="劉子濤")
 

 

 

 

 

 

命名關鍵字引數

(1) def func(a,b,*,c,d) 跟在*號后面的c和d是命名關鍵字引數
(2) def func(*args,e,**kwargs) 加在*args和**kwargs之間的引數都是命名關鍵字引數

命名關鍵字引數 : 在呼叫函式時,必須使用關鍵字實參的形式來進行呼叫;

定義方法一

def func(a,b,*,c,d):
    print(a,b)
    print(c,d)
    
# 必須指定關鍵字實參,才能對命名關鍵字形參進行賦值
func(1,2,c=3,d=4)

 

定義方法二

def func(*args,e,**kwargs):
    print(args)   # (1, 2, 3, 4)
    print(e)      # 3
    print(kwargs) # {'a': 1, 'b': 2}
func(1,2,3,4,a=1,b=2,e=3)

 

星號的使用

* 和 ** 如果在函式的定義處使用:* 把多余的普通實參打包成元組,** 把多余的關鍵字實參打包成字典


* 和 ** 如果在函式的呼叫處使用:* 把元組或者串列進行解包,** 把字典進行解包

def func(a,b,*,c,d):
    print(a,b)
    print(c,d)

tup = (1,2)
# 函式的呼叫處 *號用法
func(*tup,c=3,d=4) # func(1,2,c=3,d=4)

# 函式的呼叫處 **號用法
dic={"c":3,"d":4}
func(1,2,**dic)    # func(1,2,c=3,d=4)

# 綜合寫法
# 函式的呼叫處
tup = (1,2)
dic={"c":3,"d":4}
func(*tup,**dic)

# 定義成如下形式,可以收集所有的實參
def func(*args,**kwargs):
    pass

 

總結:

當所有的形參都放在一起的時候,順序原則:普通形參 -> 默認形參 -> 普通收集形參 -> 命名關鍵字形參 -> 關鍵字收集形參

def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)


# 以上兩個函式 列印結果 #(一) f1(1, 2) # a =1 b=2 c=0 args=() kw={} f1(1, 2, c=3) # a=1,b=2,c=3,args=() kw={} f1(1, 2, 3, 'a', 'b') #a=1 b=2 c=3 args=(a,b) kw={} f1(1, 2, 3, 'a', 'b', x=99) # a=1 b=2 c=3 args=(a,b) kw={x:99} f2(1, 2, d=99, ext=None)#a=1 b=2 c=0 d=99 kw={ext:None} #(二) args = (1, 2, 3, 4) kw = {'d': 99, 'x': '#'} # f1(1,2,3,4,d=99,x=#) f1(*args, **kw) # a=1 b=2 c=3 args=(4,) kw={d:99,x:#} #(三) myargs = (1, 2, 3) mykw = {'d': 88, 'x': '#'} # f2(1,2,3,d=88,x=#) f2(*myargs, **mykw) # a=1,b=2,c=3 d=88 kw={x:#} #(四) def f1(a, b, c=0, *args,d,**kw): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) print(d) f1(1,2,3, 'a', 'b',d=67, x=99,y=77) # a=1 b=2 c=3 args=(a,b) kw={x:99,y:77} # d=67

 

 



 

 

 

return 自定義函式的回傳值

 

概念:return 把函式內部的資料回傳到函式的外面,回傳到函式的呼叫處
1.return + 六大標準資料型別 , 除此之外還可以回傳函式 或者 是類物件
2.return 在執行時,意味著終止函式,后面的代碼不執行.
3.如果不定義return回傳值,默認回傳None

(1) return + 六大標準資料型別

def func():
    # return 111
    # return 6.89
    # return "你好帥啊,我愛死你樂"
    # return [1,2,3]
    # return {"a":1,"b":2}
    return 1,2,3 # 回傳元組
res = func()
print(res)

 

(2) return 在執行時,意味著終止函式,后面的代碼不執行.

def func():
    print(1)
    print(2)
    return 3
    print(4)
res = func()
print(res)

def func():
    for i in range(5):
        if i == 3:
            return 4
        print(i)
res = func()
print(res)

 

(3) 如果不定義return回傳值,默認回傳None

def func():
    pass
    
res = func()
print(res) # None
    
# 注意點 列印的資料和回傳的資料不是等價的,回傳的資料是可以自定義的;
res = print(1234)
print(res)  # None

 

模擬+-*/計算器

 

"""
功能:   完成計算
引數:   2個數字和運算子
回傳值: 計算后的結果
"""
def calc(num1,num2,sign):
    if sign == "+":
        return num1 + num2
    elif sign == "-":
        return num1 - num2
    elif sign == "*":
        return num1 * num2
    elif sign == "/":
        if num2 == 0:
            return "除數不能為零"
        return num1 / num2
    else:
        return "抱歉,超出了我的運算范圍."
    
res = calc(3,5,"+")
res = calc(3,5,"-")
res = calc(3,5,"*")
res = calc(3,0,"/")
res = calc(3,0,"&")
print(res)

 

全域變數和區域變數

1.概念
區域變數:在函式內部定義的變數就是區域變數
全域變數:在函式外部定義的變數或者在函式內部使用global關鍵字宣告是全域變數

2.作用域:
區域變數的作用范圍僅僅在函式的內部
全域變數的作用范圍橫跨整個檔案

3.生命周期:該變數的作用時長
內置命名空間 -> 全域命名空間 -> 區域命名空間 (開辟空間順序)
內置屬性 > 全域屬性 > 區域屬性 (作用時長:長->短)

 

 

 

1 區域變數

def func():
# 定義一個區域變數
a = 1
# 獲取當前的區域變數
print(a)
# 修改一個區域變數
a = 2
print(a)

func()
# print(a) error

 

2.全域變數

# 定義一個全域變數
b = 10
# 獲取當前的全域變數
print(b)
# 修改一個全域變數
b = 20
print(b)

def func():
    print(b)
func()

 

3.函式內部定義全域變數

def func():
    global c
    c =30
func()
print(c)

 

4.函式內部修改全域變數

d = 50
def func():
    global d
    d = 51
func()
print(d)

 

總結:

global的使用如果當前不存在全域變數,可以在函式內部通過global關鍵字來定義全域變數,如果當前存在全域變數,可以在函式內部通過global關鍵字來修改全域變數

 

函式名的使用

python中的函式可以像變數一樣,動態創建,銷毀,當引數傳遞,作為值回傳,叫第一類物件.其他語言功能有限

def func():
  print( "我是func函式")

 

(1)動態創建

a = 1
print(a)
a = func
a()

 

(2)動態銷毀

del a
# a()
# func()

 

(3)當引數傳遞

def func2():
    return "我是func2函式"

def func1(f):
    return f() # "我是func2函式"

res = func1(func2)
print(res)

 

(4)作為值回傳

def func3():
    print( "我是func3函式" )
    
def func4(f):
    return f
res = func4(func3)    
print(res)
res()

 

 

 

(5)函式名可以作為容器型別資料的元素

lst = [func,func3]
for i in lst:
    i()

 

__doc__ 或者help查看檔案

def big_chang_cishen(something):
    """
    功能: 教你怎么吃大腸
    引數: 吃的內容
    回傳值: 是否滿意
    """
    print("把{}洗一洗".format(something))
    print("直接找腸子頭,放嘴里,吸一下")
    print("擦擦嘴,滿意的放下腸子頭")
    return "吃完了,真好吃~"
    
big_chang_cishen("生腸子")
# 方法一
res = big_chang_cishen.__doc__
print(res)
# 方法二
help(big_chang_cishen)

 

函式的嵌套

互相嵌套的兩個函式:包裹在外層的叫做外函式,內層的就是內函式

def outer():
    # inner()
    def inner():
        print("我是inner函式")


# (1)內部函式可以直接在函式外部呼叫么 不行
# inner()
# (2)呼叫外部函式后,內部函式可以在函式外部呼叫嗎 不行
# outer()
# inner()
# (3)內部函式可以在函式內部呼叫嗎 可以
outer()
# (4)內部函式在函式內部呼叫時,是否有先后順序 有的
# 先定義在呼叫
# 在其他語言中有預加載的機制,提前把函式駐留到記憶體中,然后再去編譯腳本內容
# python沒有預加載函式的機制,只能先定義在呼叫;

外函式是outer  中間函式是inner  最里層是smaller ,呼叫smaller函式

def outer():
    def inner():
        def smaller():
            print("我是smaller函式")
        smaller()
    inner()
outer()

 

LEGB 原則

def outer():    
    
    def inner():
        
        def smaller():    
            
            print(a)
        smaller()
    inner()
outer()

LEGB原則(就近找變數原則)
找尋變數的呼叫順序采用LEGB原則(即就近原則)
B —— Builtin(Python);Python內置模塊的命名空間 (內建作用域)
G —— Global(module); 函式外部所在的命名空間 (全域作用域)
E —— Enclosing function locals;外部嵌套函式的作用域(嵌套作用域)
L —— Local(function);當前函式內的作用域 (區域作用域)
依據就近原則,從下往上 從里向外 依次尋找

 

nonlocal的使用 (用來修改區域變數)

nonlocal遵循LEGB原則
(1) 它會找當前空間上一層的變數進行修改
(2) 如果上一層空間沒有,繼續向上尋找
(3) 如果最后找不到,直接報錯

 

(1)它會找當前空間上一層的變數進行修改

def outer():
    a = 10
    def inner():
        nonlocal a
        a = 20
        print(a)
    inner()
    print(a)
outer()

 

(2)如果上一層空間沒有,繼續向上尋找

def outer():
    a = 20
    def inner():
        a = 15
        def smaller():
            nonlocal a
            a = 30
            print(a)
        smaller()
        print(a)
    inner()
    print(a)
outer()

 

(3)如果最后找不到,直接報錯

'''nonlocal 只能修改區域變數'''

a = 20
def outer():    
    def inner():
        def smaller():
            nonlocal a
            a = 30
            print(a)
        smaller()
        print(a)
    inner()
    print(a)
outer()
error

 

(4) 不通過nonlocal 是否可以修改區域變數呢?ok

def outer():
    lst = [1,2,3]
    def inner():
        lst[-1] = 3000
    inner()
    print(lst)
outer()

 

閉包函式

互相嵌套的兩個函式,如果內函式使用了外函式的區域變數,并且外函式把內函式回傳出來的程序叫做閉包,

里面的內函式叫做閉包函式

是不是閉包?
1.內函式用了外函式的那個區域變數
2.外函式回傳內函式

 

1.基本語法形式

def zhaoshenyang_family():
    father = "馬云"
    def hobby():
        print("我對錢沒有一絲絲的興趣,我不看重錢,這是我爸爸{}說的".format(father))
    return hobby

func = zhaoshenyang_family()
func()

 

 

2.閉包的復雜形式

def zhaowanli_family():
    gege = "王思聰"
    didi = "鞋王,高振寧"
    money = 1000
    
    def gege_hobby():
        nonlocal money
        money -= 500
        print("我交朋友不在乎他有沒有錢,反正都沒有我有錢.我就喜歡交女朋友... 錢物還剩下{}".format(money))
        
    def didi_hobby():
        nonlocal money
        money -= 400
        print("家里有鞋柜,各式各樣的奢侈鞋,一雙大概20~30萬,錢物還剩下{}".format(money))
    
    def big_master():
        return [gege_hobby,didi_hobby]
    
    return big_master
    
func = zhaowanli_family()
print(func)
lst = func()
print(lst)

# 獲取哥哥函式
gege = lst[0]
gege()
# 獲取弟弟函式
didi = lst[1]
didi()

 

 

 

3.使用 __closure__ , cell_contents 判定閉包

"""如果回傳的元組中有資料說明是閉包,誰的生命周期被延長就列印誰"""
tup = func.__closure__
print(tup)

# 先獲取第一個單元格  cell_contents獲取物件中的內容
func1 = tup[0].cell_contents
print("<11111>")
"""列印閉包函式didi_hobby中,生命周期被延長的屬性"""
print(func1.__closure__[0].cell_contents)
func1()
    
# 在獲取第二個單元格  cell_contents獲取物件中的內容
func2 = tup[1].cell_contents
print("<22222>")
"""列印閉包函式gege_hobby中,生命周期被延長的屬性"""
print(func2.__closure__[0].cell_contents)
func2()

 

 

閉包特點

特點:在閉包函式中,內函式使用了外函式的區域變數,該變數會與內函式發生系結,延長該變數的生命周期,持續到腳本執行結束.(生命周期和全域變數一樣長,但不是全域變數)

def outer(val):
    def inner(num):
        return val + num
    return inner
    
func = outer(10)
res = func(15)
print(res)

 

 

 

 

 

閉包的意義

全域變數的作用域大,容易被篡改

num = 0
def click_num():
    global num
    num += 1 # num = num + 1
    print(num)
click_num()
click_num()
click_num()
num = 100
click_num()
click_num()

 

改造,用閉包來實作

閉包的意義:閉包可以優先使用外函式中的變數,并對閉包中的值起到了封裝保護的作用.

def outer():
    x = 0
    def click_num():
        nonlocal x
        x += 1
        print(x)
    return click_num

click_num = outer()
click_num()
click_num()
click_num()
x = 100
click_num()
click_num()

 

匿名函式 lambda運算式

用一句話來表達只有回傳值的函式

語法:   lambda  引數:回傳值

特點: 簡介,高效

 

(1)無參的lambda運算式

def func():
    return "文哥是個帥哥"

改造

func = lambda : "文哥是個帥哥"
print(  func()  )

(2)有參的lambda運算式

def func(n):
    return id(n)

改造

func = lambda n : id(n)
print( func(100) )

 

(3)帶有判斷條件的lambda運算式

def func(n):
    if n % 2 == 0:
        return "偶數"
    else:
        return "奇數"

改造

func = lambda n : "偶數" if n % 2 == 0 else "奇數"
print( func(44) )

三元運算子

只能表達雙向分支 只有if else 比較固定 不靈活的語法 

語法: 真值 if 條件運算式 else 假值
如果條件運算式成立為True , 回傳if前面的真值,反之,回傳else后面的假值

n = 13
res = "偶數" if n % 2 == 0 else "奇數"
print(res)

 

小練習 : 比較兩者之間的最大值進行回傳

def func(x,y):
    if x > y:
        return x
    else:
        return y

改造

func = lambda x,y : x if x>y else y
print(  func(40,30)  )

 

locals 與 globals 使用 (了解)

 

一.locals 獲取當前作用域所有的變數

 

1.全域空間

locals 在函式 , 獲取的是列印之前所有的全域變數
locals 在函式 , 獲取的是呼叫之前所有的區域變數

def func():
    a1 = 1
    b2 = 2

a = 1
b = 2
res = locals()
c = 3
print(res)
d = 4

 

2.區域空間

a = 1
b = 2
def func():
    a1 = 1
    b2 = 2
    res = locals()
    c3 = 3
    print(res)
    d4 = 4
c = 3
func()
d = 4

 

二.globals 只獲取全域空間的全域變數

globals 在函式 , 獲取的是列印之前所有的全域變數
globals 在函式 , 獲取的是呼叫之前所有的全域變數

 

1. 全域空間

def func():
    a1 = 1
    b2 = 2

a = 1
b = 2
res = globals()
c = 3
print(res)
d = 4

 

2.區域空間

a = 1
b = 2
def func():
    a1 = 1
    b2 = 2
    res = globals()
    c3 = 3
    print(res)
    d4 = 4
c = 3 
func() #globals()
d = 4

 

globals  回傳的是內置系統的全域字典

通過字串可以創建出變數 一般應用在框架中

def func():
    dic = globals()
    for i in range(1,5):
        # 批量在dic當中添加鍵值對,以創建全域變數
        dic[ "a%d" % (i) ] = i 
        """
        dic["a1"] = 1
        dic["a2"] = 2
        dic["a3"] = 3
        dic["a4"] = 4
        """
func()
print(a1,a2,a3,a4)

 

迭代器

迭代器:
能被next()函式呼叫并不斷回傳下一個值的物件稱為迭代器(Iterator 迭代器是物件)
概念:
迭代器指的是迭代取值的工具,迭代是一個重復的程序,每次重復都是基于上一次的結果而繼續的,
單純的重復并不是迭代
特征:
并不依賴索引,而通過next指標(記憶體地址尋址)迭代所有資料,一次只取一個值,

而不是一股腦的把所有資料放進記憶體.大大節省空間,

一.可迭代物件

如果"__iter__" 在串列里就是可迭代物件 ( __iter__  in  一個串列 )

setvar = {"王同培","馬春配","趙萬里","趙沈陽"}
# 獲取當前物件的內置成員
lst = dir(setvar)
print(lst)
# 判斷是否是可迭代物件
res = "__iter__" in lst
print(res)
# for i in setvar:
    # print(i)

 

二.迭代器

for回圈之所以可以遍歷所有的資料,是因為底層使用了迭代器,通過地址尋址的方式,一個一個的找資料;
可迭代物件 -> 迭代器 實際上就是從不能夠被next直接呼叫 -> 可以被next指標直接呼叫的程序

如果是可迭代物件 -> 不一定是迭代器
如果是迭代器 -> 一定是可迭代物件

 

1.如何創建一個迭代器

setvar = {"王同培","馬春配","趙萬里","趙沈陽"}
it = iter(setvar)
print(it)

 

2.如何判斷一個迭代器

不僅要有_ _iter_ _  還要有  _ _next_ _  在這個it里面

print(dir(it))
res = "__iter__" in dir(it)  and "__next__" in dir(it)
print(res)

 

3.如何呼叫一個迭代器

next是單向不可逆的程序,一條路走到黑

res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)
# res = next(it)
# print(res)     # error 因為單向不可逆 一條路走到黑

 

4.重置迭代器

it = iter(setvar)
print(  it.__next__()  )
print(  it.__next__()  )
print(  it.__next__()  )
print(  it.__next__()  )

 

 5.呼叫迭代器的其他方法

1.for

it = iter(setvar)
for i  in  it:
    print(i)

2.for + next

it = iter(setvar)
for i in range(2):
    print( next(it) )

print( next(it) )
print( next(it) )
# print( next(it) ) error  超出了尋址范圍

 

6.判斷迭代器/可迭代物件的其他方法

# 從...模塊 引入...內容
from collections import Iterator, Iterable
"""Iterator 迭代器 Iterable 可迭代的物件"""
res = isinstance(it,Iterator)
print(res)
res = isinstance(it,Iterable)
print(res)

 

7.range是迭代器么?

print(isinstance(range(10),Iterator)) # False
print(isinstance(range(10),Iterable)) # True

 

變成迭代器

it = range(10).__iter__()
print(isinstance(it,Iterator)) # True
print(isinstance(it,Iterable)) # True

呼叫it  (next)

res = next(it)
print(res)
res = next(it)
print(res)

for + next

for i in range(3):
    print(next(it))  # 2 3 4

for

for i in it:
    print(i)

 

 

高階函式 : 能夠把函式當成引數傳遞的就是高階函式 (map ,filter ,reduce , sorted)

 

map

map(func,iterable)
功能: 處理資料
  把iterable中的資料一個一個拿出來,扔到func做處理,通過呼叫迭代器來獲取回傳值
引數:
  func : 函式(內置函式,自定義函式)
  iterable : 可迭代性物件 (容器型別資料,range物件,迭代器)
回傳值:
  迭代器

 

(1) 把串列中的元素都變成整型

lst = ["1","2","3","4"]
lst_new = []
for i in lst:
    lst_new.append(int(i))
print(lst_new)

用map改寫

from collections import Iterator,Iterable
it = map(int,lst)
print(isinstance(it,Iterator))

"""
代碼決議:
第一次呼叫迭代器
先把串列中的第一個元素"1"拿出來扔到int中做強轉,變成整型1回傳出來
第二次呼叫迭代器
先把串列中的第一個元素"2"拿出來扔到int中做強轉,變成整型2回傳出來
第三次呼叫迭代器
先把串列中的第一個元素"3"拿出來扔到int中做強轉,變成整型3回傳出來
第四次呼叫迭代器
先把串列中的第一個元素"4"拿出來扔到int中做強轉,變成整型4回傳出來
"""

 

1.呼叫迭代器 next

print(next(it))
print(next(it))
print(next(it))
print(next(it))
# print(next(it)) error

 

2.呼叫迭代器 for

it = map(int,lst)
for i in it:
    print(i)

 

3.呼叫迭代器 for + next

it = map(int,lst)
for i in range(3):
    print(next(it))

 

4.強轉迭代器 => 串列

it = map(int,lst)
print(list(it)

 

 

(2) [1,2,3,4] => [2,8,24,64]

 

# print(1 * 2 ** 1)
# print(2 * 2 ** 2)
# print(3 * 2 ** 3)
# print(4 * 2 ** 4)

# 1 << 1
# 2 << 2
# 3 << 3
# 4 << 4

lst = [1,2,3,4]
lst_new = []
for i in lst:
    lst_new.append(i << i)
print(lst_new)

map改寫

def func(n):
    print(1111)
    return n << n
    
it = map(func,lst)
print(list(it))


"""
只有在呼叫迭代器的時候,才會真正觸發map函式中的所有內容;不呼叫不觸發;
強轉迭代器時,把可以呼叫的所有資料都放到串列中
第一次呼叫時:
把1拿出來,扔func當中做處理,回傳2,
第二次呼叫時:
把2拿出來,扔func當中做處理,回傳8,
第三次呼叫時:
把3拿出來,扔func當中做處理,回傳24,
第四次呼叫時:
把4拿出來,扔func當中做處理,回傳64,
到此串列[2,8,24,64]

注意點:形參和回傳值必須寫;
"""

 

(3) 給你一個串列["a","b","c"] => [97,98,99]

字典的鍵值翻轉操作

dic = {97:"a",98:"b",99:"c"}
dic_new = {}
for k,v in dic.items():
    # print(k,v) # 97 a | 98 b | 99 c
    dic_new[v] = k # dic_new["a"] = 97
print(dic_new)

lst = ["a","b","c"]
lst_new = []
for i in lst:
    lst_new.append(dic_new[i])
print(lst_new)

map改寫

lst = ["a","b","c"]# func 實作字典的翻轉,通過給與a,b,c三個鍵,得到對應的ascii碼,通過list強轉得到串列
def func(n):
    print(n)
    dic = {97:"a",98:"b",99:"c"}
    dic_new = {}
    for k,v in dic.items():
        dic_new[v] = k 
    print(dic_new) # {'a': 97, 'b': 98, 'c': 99}
    return dic_new[n]

        
it = map(func,lst)
print(list(it))

 

reduce

reduce(func,iterable)
功能: 計算資料
  把iterable中的前兩個資料扔到func函式中做計算,把計算的結果和iterable中第三個值在繼續扔到func中做計算,以此類推 ...   最后回傳計算的結果 


引數:

  func: 自定義函式
  iterable : 可迭代物件 (容器型別資料 range物件 迭代器)
回傳值:
  計算的結果

 

(1) [7,7,5,8] => 7758

lst = [7,7,5,8]

# 方法一
strvar = ""
for i in lst:
    strvar += str(i)
res = int(strvar)
print(res , type(res))

# 方法二
"""
7 * 10 + 7 = 77
77 * 10 + 5 = 775
775 * 10 + 8 = 7758
"""
# 1.先變成迭代器
it = iter(lst)
# 2.取出兩個值
num1 = next(it)
num2 = next(it)
print(num1,num2)
# 做計算
total = num1 * 10 + num2
print(total) # 77
# 3.把計算的結果在和剩下的資料做計算
for num in it:
    total = total * 10 + num
# 4.回傳最后的結果
print(total , type(total))

reduce改寫

'''從...functools模塊, 引入 .. reduce方法'''
from functools import reduce
lst = [7,7,5,8]
def func(x,y):
    # print(x,y)
    return x * 10 + y
res = reduce(func,lst)
print(res)

# 使用lambda 進行改造
print(reduce(lambda x,y: x*10 + y,lst))

 

(2) "123" => 123 不使用int的情況下實作該操作;

strvar = "123"
def func(x,y):
    return x * 10 + y

# 把字串"123" 處理成數字的123
def func2(n):
    # dic = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}
    dic = {}
    for i in range(10):
        dic[str(i)] = i    
    return dic[n]

it = map(func2,strvar)
# res = reduce(func,it)
# print(res,type(res))
# 簡寫
print(reduce(lambda x,y: x*10 + y,it))

 

filter

filter(func,iterable)
功能: 過濾資料
   在自定義的函式中,
   如果回傳True, 該資料保留
   如果回傳False,該資料舍棄
引數:
   func: 自定義函式
   iterable : 可迭代物件 (容器型別資料 range物件 迭代器)
回傳值:
   迭代器

 

1.只要串列中所有的偶數

lst = [1,2,34,5,65,6,56,7,56,756,7567,11]
lst_new = []
for i in lst:
    if i % 2 == 0 :
        lst_new.append(i)
print(lst_new)

filter改寫

def func(n):
    if n % 2 == 0:
        return True
    else:
        return False
it = filter(func,lst)
print(list(it))

使用lambda 改寫

it = filter(lambda n :True if n % 2 == 0 else False , lst)
print(list(it))
print(list(filter(lambda n :True if n % 2 == 0 else False , lst)))

 

sorted

sorted(iterable,key=函式,reverse=False)
功能:排序資料
引數:
  iterable : 可迭代物件 (容器型別資料 range物件 迭代器)
  key : 指定函式(自定義/內置)
  reverse : 是否倒序
回傳值:
  串列

 

tup = (-90,89,78,3)
# 1.從小到大
res = sorted(tup)
print(res,type(res))

# 2.從大到小
res = sorted(tup,reverse = True)
print(res,type(res))

# 3.按照絕對值進行排序
tup = (-90,-100,1,2)
res = sorted(tup,key=abs)
print(res)
"""
1 => abs(1) => 1
2 => abs(2) => 2
-90 => abs(-90) => 90
-100 => abs(-100) => 100
"""

# 4.按照自定義函式進行排序
tup = (19,23,42,87)
"""
42 % 10 2 => 42
23 % 10 3 => 23
87 % 10 7 => 87
19 % 10 9 => 19
"""
def func(n):
    print(n)
    return n % 10
lst = sorted(tup,key = func)
print(lst)

 

5.任意的容器型別資料都可以通過sorted排序

container = "abc"
container = [1,2,3]
container = (1,2,3)
container = {"你好","王文","你真帥"}
container = {"caixukun","xiaozhan","zhaoshenyang","wangyibo"}
container = {"ww":"英俊帥氣","zxy":"猥瑣摳腳","zwl":"斯文敗類"} # 排的是字典的鍵
print(sorted(container))

 

總結:
sorted (推薦使用sorted)
  (1) 可以排序所有的容器型別資料
  (2) 回傳一個新的串列
sort
  (1) 只能排序串列
  (2) 基于原來的串列進行排序

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/428473.html

標籤:Python

上一篇:通過案例實戰深入認識python影像處理庫Pillow

下一篇:ECharts回圈push資料到series,從而實作series的動態處理之(一)(先用給定資料,后期用后端回傳資料)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more