欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python編程中被忽視的核心技巧總結(jié)

 更新時(shí)間:2023年08月13日 16:18:23   作者:Python數(shù)據(jù)開發(fā)  
這篇文章主要介紹了一些在?Python?編程中可能被忽視的核心功能,包括默認(rèn)參數(shù)、海象運(yùn)算符、*args?和?**kwargs?的使用等,需要的可參考下

這篇文章主要介紹了一些在 Python 編程中可能被忽視的核心功能,包括默認(rèn)參數(shù)、海象運(yùn)算符、*args 和 **kwargs 的使用、變量交換、str 與 repr 的區(qū)別、可迭代對(duì)象的擴(kuò)展解包、多個(gè)上下文管理器的使用、Python 調(diào)試器、collections.Counter 的使用、itertools 的使用以及下劃線的兩種用法等。

因?yàn)檫@門語言非常容易學(xué),許多實(shí)踐者只是了解了它的基礎(chǔ)知識(shí),而忽略了深入探討這門語言更高級(jí)和強(qiáng)大的方面,這也是它真正獨(dú)特和強(qiáng)大的地方。

所以,讓我們簡要討論一下所有你可能還沒有聽說過的功能,但如果你想成為一名真正經(jīng)驗(yàn)豐富的 Pythonista,你肯定想了解。

參數(shù)默認(rèn)值

需要重點(diǎn)注意的是,Python 的參數(shù)在遇到函數(shù)定義時(shí)就進(jìn)行評(píng)估。這意味著每次調(diào)用 fib_memo 函數(shù)(下文會(huì)提到)而沒有明確提供 memo 參數(shù)的值時(shí),它將使用函數(shù)定義時(shí)創(chuàng)建的相同字典對(duì)象。

def fib_memo(n, memo={0:0, 1:1}):  
    """   
    n 是你想要返回的序列中的第 n 個(gè)數(shù)字   
    """  
    if not n in memo:    
        memo[n] = fib_memo(n-1) + fib_memo(n-2)  
    return memo[n]
# 返回一個(gè)介于0和100之間(包括0和100)的數(shù)字。 
fib_memo(6)  # 應(yīng)該返回8

這段代碼在 Python 中可以正常運(yùn)行。這也意味著你可以在一個(gè)腳本中多次執(zhí)行 fib_memo 函數(shù),比如在一個(gè) for 循環(huán)中,每次執(zhí)行都會(huì)增加要計(jì)算的 fibonacci 數(shù)字,而不會(huì)達(dá)到“超過最大遞歸深度”的限制,因?yàn)?memo 會(huì)不斷擴(kuò)展。關(guān)于這方面的更多信息可以在我的另一篇文章中找到。

海象操作符

海象操作符 (:= ) 是在 Python 3.8 中引入的,它允許你在表達(dá)式中為變量賦值。這樣,你可以在一個(gè)表達(dá)式中為變量賦值并檢查其值:

import random
some_value = random.randint(0,100)  # 返回一個(gè)介于0和100之間(包括0和100)的數(shù)字。
if((below_ten := some_value) < 10):    
    print(f"{below_ten} 小于 10")

顯然,它也可以方便地賦值并檢查返回的值是否包含真值:

if(result := some_method()):   # 如果結(jié)果不為假值(Falsy)  
    print(result)

*args 和 **kwargs

通過星號(hào) (* ),你可以在傳遞給函數(shù)之前解包參數(shù)或關(guān)鍵字參數(shù)(使用 ** )。

例如,考慮以下代碼:

my_numbers = [1,2]
def sum_numbers(first_number, second_number):    
    return first_number + second_number
# 這將返回一個(gè)類型錯(cuò)誤。
# 類型錯(cuò)誤:sum() 缺少 1 個(gè)必需的位置參數(shù):“second_number” sum_numbers(my_numbers)
#這將返回預(yù)期的結(jié)果,3。
sum_numbers(*my_numbers)

當(dāng)我們調(diào)用 sum_numbers 函數(shù)時(shí),如果不解包 my_numbers,它會(huì)引發(fā)一個(gè) TypeError ,因?yàn)楹瘮?shù)期望兩個(gè)獨(dú)立的參數(shù)。然而,通過使用星號(hào) (*),我們可以從 my_numbers 中解包值并將它們作為獨(dú)立的參數(shù)傳遞,從而得到正確的輸出。

這種解包技術(shù)不僅適用于元組和列表,還適用于字典(盡管它會(huì)將鍵作為參數(shù)傳遞)。那么關(guān)鍵字參數(shù)呢?對(duì)此,我們可以利用雙星號(hào) (**)。以下代碼作為例子:

def greet_person(last_name, first_name):  
    print(f"Hello {first_name} {last_name}")
data = {"first_name": "John", "last_name": "Doe"}
greet_person(**data)

除了解包一個(gè)序列來將它們作為函數(shù)的參數(shù),你也可以用它來創(chuàng)建一個(gè)新的序列,例如:

numbers = [1, 2, 3, 4, 5]
new_list_numbers = [*numbers]

原始的 numbers 列表保持不變,而你有一個(gè) new_list_numbers 變量,它包含了相同列表的副本。然而,對(duì)于包含對(duì)象的鏈接要小心:

numbers = [[1, 2], [3, 4], [5, 6]]
packed_numbers = [*numbers]
numbers[0].append(10)   # 修改原始列表中的嵌套列表
print(numbers)      # 輸出: [[1, 2, 10], [3, 4], [5, 6]]    
print(packed_numbers)   # 輸出: [[1, 2, 10], [3, 4], [5, 6]]

any 和 all

any 和 all 是兩個(gè)內(nèi)建函數(shù),它們對(duì)可迭代對(duì)象(如列表、元組或集合)進(jìn)行操作,并基于可迭代對(duì)象中的元素返回一個(gè)布爾值。

例如:

some_booleans = [True, False, False, False]
any(some_booleans) # 返回 True
all(some_booleans) # 返回 False

你可以將 all 和 any 函數(shù)與列表推導(dǎo)式結(jié)合使用,它返回一個(gè)可迭代的結(jié)果并將其作為參數(shù)傳遞給 all 函數(shù):

numbers = [5, 10, 3, 8, -2]
all_positive = all(num > 0 for num in numbers)

… 或 any 函數(shù):

fruits = ['apple', 'banana', 'cherry', 'durian']
# 檢查是否所有水果都以“a”開頭
result = all(fruit.startswith('a') for fruit in fruits)
print(result)

下面的表格顯示了根據(jù)可迭代對(duì)象中的值返回的輸出的不同。

變量交換

你可以組合元組打包(在等號(hào) (=) 右邊發(fā)生)和解包(在等號(hào) (=) 左邊發(fā)生),并利用這個(gè)功能進(jìn)行變量交換:

a = 10
b = 5
# 通過打包和解包交換 b 和 a 的值
a, b = b, a
print(a)  #5
print(b)  #10

str vs repr

我們習(xí)慣于使用 str(some_value) 將某個(gè)變量或值轉(zhuǎn)換為字符串,以便于進(jìn)行調(diào)試打印。我想讓你了解 repr(some_value)。主要的區(qū)別是 repr 嘗試返回對(duì)象的可打印表示,而 str 只嘗試返回一個(gè)字符串表示。

下面是一個(gè)更好的例子:

import datetime
today = datetime.datetime.now()
print(str(today))print(str(today))   # 輸出: 2023-07-20 15:30:00.123456
print(repr(today))  # 輸出:datetime.datetime(2023, 7, 20, 15, 30, 0, 123456)

如你所見,str() 簡單地將 datetime 作為一個(gè)字符串表示返回。如果你想確定變量 today 是否包含一個(gè)字符串還是一個(gè) datetime 對(duì)象,你無法單獨(dú)從這個(gè)信息中得到答案。另一方面,repr() 提供了有關(guān)變量所持有的實(shí)際對(duì)象的信息。在調(diào)試過程中,這個(gè)信息會(huì)更有價(jià)值。

擴(kuò)展的可迭代對(duì)象解包

這個(gè)可以簡單理解:如果你想通過一個(gè)命令獲取序列的第一個(gè)和最后一個(gè)值:

first, *middle, last = [1, 2, 3, 4, 5]
print(first)  # 1
print(middle) # [2, 3, 4]
print(last)   # 5

但這也是可行的

*the_first_three, second_last, last = [1, 2, 3, 4, 5]
print(the_first_three) # [1, 2, 3]
print(second_last)     # 4
print(last)            # 5

或者其他組合。

多個(gè)上下文管理器

我們習(xí)慣于一次使用一個(gè)上下文管理器,比如打開一個(gè)文件:

with open('file.txt', 'r') as file:
    # 使用該文件的代碼
    # 該文件將在塊結(jié)束時(shí)自動(dòng)關(guān)閉
    # 即使發(fā)生異常
    # 示例:從文件中讀取行
    for line in file:
        print(line.strip())
with open('file_2.txt', 'r') as other_file:
    # 第二個(gè)上下文管理器
    for line in other_file:
        print(line.strip())

但我們可以輕易地在一個(gè)語句中打開多個(gè)文件。如果你想將一行寫入另一個(gè)文件,這非常簡便:

with open('file1.txt') as file1, open('file2.txt') as file2:
    # 同時(shí)使用 file1 和 file2 的代碼
    # 文件將在塊結(jié)束時(shí)自動(dòng)關(guān)閉
    # 即使發(fā)生異常
    # 示例:從文件 1 讀取行并將其寫入文件 2
    for line in file1:
        file2.write(line)

Python 調(diào)試器

我們可以在我們的文件中打印大量的變量進(jìn)行調(diào)試,或者我們可以簡單地使用 Python 調(diào)試器 (pdb),它幫助我們設(shè)置斷點(diǎn),使得操作更加簡單:

import pdb
# 在你的代碼中設(shè)置這個(gè)斷點(diǎn)
pdb.set_trace()

使這個(gè)功能更有價(jià)值的是,程序會(huì)在你設(shè)置的斷點(diǎn)處停止,你可以打印任何變量來檢查其在特定斷點(diǎn)處的值或存在情況。試試看!當(dāng)程序觸發(fā)一個(gè)斷點(diǎn)時(shí),你可以使用以下幾個(gè)命令:

  • n 或 next:執(zhí)行下一行。
  • s 或 step:步入函數(shù)調(diào)用。
  • c 或 continue:繼續(xù)執(zhí)行直到下一個(gè)斷點(diǎn)。
  • l 或 list:顯示當(dāng)前的代碼上下文。
  • p 或 pp :打印表達(dá)式的值。
  • b 或 break :在指定的行設(shè)置一個(gè)新的斷點(diǎn)。
  • h 或 help:獲取關(guān)于 pdb 的使用幫助。
  • q 或 quit:退出調(diào)試器并終止程序。

collections.Counter

collections 模塊中的 Counter 類提供了一種便捷的方式來計(jì)算可迭代對(duì)象中的元素個(gè)數(shù):

Counter``collections
from collections import Counter
my_list = [1, 2, 3, 1, 2, 1, 3, 4, 5]
counts = Counter(my_list)
print(counts)  # 輸出: 計(jì)數(shù)器({1: 3, 2: 2, 3: 2, 4: 1, 5: 1})

使用 Itertools 實(shí)現(xiàn)組合

我們可以組合不同的 for 循環(huán)來創(chuàng)建排列、組合或笛卡爾積,或者我們可以簡單地使用內(nèi)建的 itertools。

Permutations(排列)

import itertools
# 生成排列
perms = itertools.permutations([1, 2, 3], 2)
print(list(perms))  # 輸出: [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

Combinations(組合)

import itertools
# 生成組合
combs = itertools.combinations('ABC', 2)
print(list(combs))  # 輸出: [('A', 'B'), ('A', 'C'), ('B', 'C')]

Cartesian product(笛卡爾積)

import itertools
# 生成笛卡爾積
cartesian = itertools.product('AB', [1, 2])
print(list(cartesian))  # 輸出: [('A', 1), ('A', 2), ('B', 1), ('B', 2)]

下劃線的兩種用法

下面是在 Python 中使用下劃線的兩種方式:作為大數(shù)字的分隔符或作為丟棄變量。

丟棄變量

下劃線 _ 可以用作丟棄變量,用來丟棄不想要的值:

# 忽略函數(shù)的第一個(gè)返回值
_, result = some_function()
# 不使用循環(huán)變量進(jìn)行循環(huán)
for _ in range(5):
    do_something()
# 你只需要第一個(gè)和最后一個(gè)
first, *_, last = [1, 2, 3, 4, 5]

大數(shù)字的分隔符

在處理大數(shù)字值時(shí),你可以使用下劃線 (_) 作為視覺分隔符以提高可讀性。這個(gè)特性在 Python 3.6 中被引入,被稱為 “下劃線字面量”。

population = 7_900_000_000
revenue = 3_249_576_382.50
print(population)  # 輸出: 7900000000
print(revenue)  # 輸出: 3249576382.5

到此這篇關(guān)于Python編程中被忽視的核心技巧總結(jié)的文章就介紹到這了,更多相關(guān)Python技巧內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PyCharm創(chuàng)建Django項(xiàng)目的簡單步驟記錄

    PyCharm創(chuàng)建Django項(xiàng)目的簡單步驟記錄

    PyCharm是一種Python?IDE,帶有一整套可以幫助用戶在使用Python語言開發(fā)時(shí)提高其效率的工具,下面這篇文章主要給大家介紹了關(guān)于利用PyCharm創(chuàng)建Django項(xiàng)目的簡單步驟,需要的朋友可以參考下
    2022-07-07
  • python Tkinter版學(xué)生管理系統(tǒng)

    python Tkinter版學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python Tkinter版學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Python接口測試get請(qǐng)求過程詳解

    Python接口測試get請(qǐng)求過程詳解

    這篇文章主要介紹了python接口測試 get請(qǐng)求過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python3 pickle模塊的使用方法詳細(xì)介紹

    Python3 pickle模塊的使用方法詳細(xì)介紹

    pickle提供了一個(gè)簡單的持久化功能??梢詫?duì)象以文件的形式存放在磁盤上,pickle序列化后的數(shù)據(jù),可讀性差,人一般無法識(shí)別,本文詳細(xì)介紹了pickle模塊的使用方法
    2021-10-10
  • 淺析使用Python搭建http服務(wù)器

    淺析使用Python搭建http服務(wù)器

    這篇文章主要介紹了使用Python搭建http服務(wù)器,本文通過代碼實(shí)例相結(jié)合給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • matplotlib 曲線圖 和 折線圖 plt.plot()實(shí)例

    matplotlib 曲線圖 和 折線圖 plt.plot()實(shí)例

    這篇文章主要介紹了matplotlib 曲線圖 和 折線圖 plt.plot()實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python中函數(shù)eval和ast.literal_eval的區(qū)別詳解

    Python中函數(shù)eval和ast.literal_eval的區(qū)別詳解

    eval函數(shù)在Python中做數(shù)據(jù)類型的轉(zhuǎn)換還是很有用的。它的作用就是把數(shù)據(jù)還原成它本身或者是能夠轉(zhuǎn)化成的數(shù)據(jù)類型。那么eval和ast.literal_val()的區(qū)別是什么呢?本文將大家介紹關(guān)于Python中函數(shù)eval和ast.literal_eval區(qū)別的相關(guān)資料,需要的朋友可以參考下。
    2017-08-08
  • Python使用tarfile模塊實(shí)現(xiàn)免費(fèi)壓縮解壓

    Python使用tarfile模塊實(shí)現(xiàn)免費(fèi)壓縮解壓

    Python自帶的tarfile模塊可以方便讀取tar歸檔文件,厲害的是可以處理使用gzip和bz2壓縮歸檔文件tar.gz和tar.bz2,這篇文章主要介紹了Python使用tarfile模塊實(shí)現(xiàn)免費(fèi)壓縮解壓,需要的朋友可以參考下
    2024-03-03
  • 手把手帶你用python爬取小姐姐私房照

    手把手帶你用python爬取小姐姐私房照

    這篇文章主要介紹了用python如何爬取小姐姐私房照,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Python實(shí)現(xiàn)自動(dòng)識(shí)別并填加驗(yàn)證碼的示例代碼

    Python實(shí)現(xiàn)自動(dòng)識(shí)別并填加驗(yàn)證碼的示例代碼

    實(shí)現(xiàn)自動(dòng)識(shí)別網(wǎng)頁中的驗(yàn)證碼并填寫,需要結(jié)合使用網(wǎng)絡(luò)爬蟲技術(shù)、圖像識(shí)別(OCR),以及可能的瀏覽器自動(dòng)化工具(如Selenium),本文給大家介紹了Python實(shí)現(xiàn)自動(dòng)識(shí)別并填加驗(yàn)證碼的示例,需要的朋友可以參考下
    2024-06-06

最新評(píng)論