自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

十個(gè) Python 秘訣將顛覆你的編碼方式

開發(fā) 前端
使用 pathlib? 使我的文件操作更簡(jiǎn)潔、更直觀。它對(duì)于管理文件路徑和簡(jiǎn)化文件處理任務(wù)尤其有用。試試 pathlib,看看它如何簡(jiǎn)化你的代碼!

通過一些實(shí)用技巧和方法,充分發(fā)揮Python的強(qiáng)大功能

對(duì)于大多數(shù)人來說,學(xué)習(xí)Python編程最初都有一定困難。它看似晦澀難懂,以至于有人甚至懷疑自己是否還需要繼續(xù)使用Excel這種傳統(tǒng)數(shù)據(jù)分析工具。

然而,只要持之以恒、循序漸進(jìn)地學(xué)習(xí),Python的門徑終將為你打開。我就是靠著堅(jiān)持不懈,不斷吸收新知識(shí),最終獲得了第一份編程工作。從那時(shí)起,我在每一份工作中都能"取之不盡、用之不竭",汲取到各種實(shí)用技巧和竅門。今天,就讓我分享其中一些精華,希望能為你的Python編程之路提供啟迪。

秘訣 1:zip函數(shù)

zip函數(shù)堪稱Python中的利器。它能將多個(gè)可迭代對(duì)象并行合并為一個(gè)可迭代的元組序列,大大簡(jiǎn)化了對(duì)多個(gè)序列的遍歷操作。這一技巧讓我徹底告別了那些冗長(zhǎng)、嵌套的循環(huán),代碼變得更加簡(jiǎn)潔可讀。

示例

我記得我需要將兩個(gè)列表中的姓名和年齡配對(duì)起來。在使用 zip 之前,我的代碼充滿了索引變量,難以理解。

names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]

for i in range(len(names)):
    print(f"{names[i]} is {ages[i]} years old")

下面是 zip 的簡(jiǎn)化過程:

names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]

# 使用 zip 并行遍歷兩個(gè)列表
for name, age in zip(names, ages):
    print(f"{name} is {age} years old")

這讓我的代碼更簡(jiǎn)潔,也更容易閱讀。無論何時(shí)您需要同時(shí)處理多個(gè)序列,zip 都是您的好朋友。在你的項(xiàng)目中試試吧,看看你的代碼會(huì)變得多么簡(jiǎn)單!

秘訣 2:華勒斯運(yùn)算符 (:=)

華勒斯運(yùn)算符(:=)為我拓展了全新的編碼視野。它允許在表達(dá)式中完成變量賦值,使得求值和賦值合二為一,使代碼更加緊湊簡(jiǎn)練。

示例

我以前編寫的代碼是在一個(gè)循環(huán)中讀取用戶輸入,直到他們輸入一個(gè)有效值。以前的方法是重復(fù)性的:

while True:
    user_input = input("Enter a number: ")
    if user_input.isdigit():
        number = int(user_input)
        break

有了海象操作器,代碼變得更加簡(jiǎn)潔:

while (user_input := input("Enter a number: ")).isdigit() == False:
    print("Invalid input, please enter a number.")

number = int(user_input)

這個(gè)小技巧讓我的循環(huán)變得更簡(jiǎn)單、更容易掌握。在類似情況下,請(qǐng)嘗試使用華勒斯運(yùn)算符(:=)來簡(jiǎn)化代碼!

秘訣 3:集合操作

集合這一數(shù)據(jù)結(jié)構(gòu)給我留下了深刻印象。作為獨(dú)特的無序集合,它支持?jǐn)?shù)學(xué)運(yùn)算如并集、交集和差集等操作。集合可高效處理唯一元素,簡(jiǎn)化復(fù)雜的集合論問題。

示例

我記得在一個(gè)項(xiàng)目中,我需要找到兩個(gè)列表中共同的項(xiàng)目和每個(gè)列表中唯一的項(xiàng)目。

list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]

# 查找共同元素
common_elements = []
for item in list1:
    if item in list2:
        common_elements.append(item)
print(f"common elements: {common_elements}")

# 在 list1 中查找唯一元素
unique_to_list1 = []
for item in list1:
    if item not in list2:
        unique_to_list1.append(item)
print(f "Unique to list1: {unique_to_list1}")

# 查找所有唯一元素
all_unique_elements = list1.copy()
for item in list2:
    if item not in all_unique_elements:
        all_unique_elements.append(item)
print(f"All unique elements: {all_unique_elements}")

使用成套工具使這項(xiàng)工作變得更加容易:

list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]

# 將列表轉(zhuǎn)換為集合
set1 = set(list1)
set2 = set(list2)

# 找出交集(共同元素)
common_elements = set1 & set2
print(f "common elements: {common_elements}")

# 找出差異(set1 中的唯一元素)
unique_too_set1 = set1 - set2
print(f "Unique to set1: {unique_too_set1}")

# 找出聯(lián)合(所有唯一元素)
all_unique_elements = set1 | set2
print(f"All unique elements: {all_unique_elements}")

使用集合可以讓代碼更高效、更易懂。無論何時(shí)需要處理唯一元素或執(zhí)行集合操作,都可以試試 Python 集合!

秘訣 4:使用 * 解包

解包操作 * 無疑是提高編碼效率的秘訣之一。它能將可迭代對(duì)象解包為函數(shù)的單個(gè)參數(shù)或變量賦值目標(biāo),賦予代碼更強(qiáng)的靈活性和可讀性。

示例

我曾為需要多個(gè)參數(shù)的函數(shù)而苦惱。

# 定義一個(gè)接收多個(gè)參數(shù)的函數(shù)
def greet(first, second, third):
    print(f "Hello {first}, {second}, and {third}!")

# 列出名字
names = ["Alice", "Bob", "Charlie"] # 從列表中手動(dòng)傳遞參數(shù)

# 從列表中手動(dòng)傳遞參數(shù)
greet(names[0], names[1], names[2])

手動(dòng)管理這些參數(shù)非常麻煩。后來我發(fā)現(xiàn)了解包:

# 定義一個(gè)接收多個(gè)參數(shù)的函數(shù)
def greet(first, second, third):
    print(f "Hello {first}, {second}, and {third}!")

# 列出名字
names = ["Alice", "Bob", "Charlie"] # 將列表解壓縮為函數(shù)參數(shù)

# 將列表解壓縮為函數(shù)參數(shù)
greet(*names)

使用 * 進(jìn)行解包后,我的函數(shù)調(diào)用和賦值變得更加簡(jiǎn)單和干凈。這一小小的改變對(duì)代碼的可讀性有很大的影響。

秘訣 5:dataclasses模塊

dataclasses模塊為我?guī)砹巳碌念惥幊腆w驗(yàn)。它能自動(dòng)創(chuàng)建類實(shí)例,無需手動(dòng)編寫__init__方法,極大簡(jiǎn)化了類的定義和維護(hù)。

示例

我以前寫過很多重復(fù)的代碼來初始化類的屬性。這既乏味又容易出錯(cuò)。后來我發(fā)現(xiàn)了 dataclasses:

from dataclasses import dataclass

# 定義一個(gè)簡(jiǎn)單的數(shù)據(jù)類
@dataclass
class Person:
    name: str
    age: int
    city: str

# 創(chuàng)建該類的實(shí)例
person = Person(name="Alice", age=30, city="New York")

print(person)

在使用 dataclasses 之前,我的代碼中充斥著大量的模板:

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person(name="Alice", age=30, city="New York")
print(person)

使用 dataclasses 使我的代碼更簡(jiǎn)潔、更易于維護(hù)。如果您需要處理大量的類定義,不妨試試 dataclasses。它將為你節(jié)省時(shí)間,并保持代碼庫(kù)的整潔!

秘訣 6:functools.lru_cache裝飾器

functools.lru_cache裝飾器可謂是破解性能瓶頸的法寶。它為函數(shù)添加了緩存功能,存儲(chǔ)計(jì)算耗費(fèi)的函數(shù)調(diào)用結(jié)果,提高了具有相同輸入的重復(fù)調(diào)用效率。

示例

我記得在做一個(gè)需要大量計(jì)算的項(xiàng)目時(shí),重復(fù)計(jì)算拖慢了一切。發(fā)現(xiàn)了 lru_cache 后,我就像撿到了救命稻草:

from functools import lru_cache

# 定義一個(gè)計(jì)算量很大的函數(shù)
@lru_cache(maxsize=100)
def expensive_function(n):
    print(f"Computing {n}...")
    return n * n

# 多次調(diào)用函數(shù)
print(expensive_function(4))
print(expensive_function(4))  # This call is cached

在使用 lru_cache 之前,我的函數(shù)調(diào)用既低效又緩慢。有了緩存,重復(fù)調(diào)用幾乎可以瞬間完成,節(jié)省了寶貴的計(jì)算時(shí)間。

對(duì)于數(shù)據(jù)處理中需要多次執(zhí)行相同計(jì)算的函數(shù),這個(gè)技巧尤其有用。它讓我的代碼變得更快、更高效。請(qǐng)嘗試在你的項(xiàng)目中使用 lru_cache,看看性能提升的效果!

秘訣 7:生成器和 yield

發(fā)現(xiàn)生成器和 yield 關(guān)鍵字對(duì)我來說是一個(gè)轉(zhuǎn)折點(diǎn)。生成器是一種特殊函數(shù),通過一次生成一個(gè)元素的方式返回可迭代序列,節(jié)省內(nèi)存并支持延遲計(jì)算。

示例

我曾經(jīng)處理過無法同時(shí)放入內(nèi)存的大型數(shù)據(jù)集。在我發(fā)現(xiàn)生成器之前,高效地迭代這些數(shù)據(jù)集是一項(xiàng)挑戰(zhàn):

def generate_squares(n):
    for i in range(n):
        yield i * i

# Use the generator
for square in generate_squares(5):
    print(square)

在使用生成器之前,我會(huì)創(chuàng)建大量列表,占用大量?jī)?nèi)存:

def generate_squares(n):
    result = []
    for i in range(n):
        result.append(i * i)
    return result

for square in generate_squares(5):
    print(square)

生成器確實(shí)是處理大型數(shù)據(jù)集的強(qiáng)大工具,它們可以有效地減少內(nèi)存消耗并提高性能。通過逐步生成數(shù)據(jù),而不是一次性讀取整個(gè)數(shù)據(jù)集,生成器可以在處理大文件和數(shù)據(jù)流時(shí)節(jié)省大量資源。

使用yield語句可以將函數(shù)轉(zhuǎn)變成生成器,這意味著它可以暫停和繼續(xù)執(zhí)行,使得代碼更加靈活和高效。此外,生成器還可以與循環(huán)結(jié)合使用,用于處理大型數(shù)據(jù)集,或者實(shí)現(xiàn)惰性計(jì)算,以及其他各種應(yīng)用場(chǎng)景。

秘訣 8:itertools模塊

在我很多項(xiàng)目中,都會(huì)經(jīng)常用到itertools 模塊。它提供了高效的數(shù)據(jù)遍歷工具函數(shù),如排列、組合和笛卡爾積等,極大提升了迭代處理的性能。

示例

我經(jīng)常需要從一個(gè)項(xiàng)目列表中生成所有可能的配對(duì)或組合。在使用 itertools 之前,我的代碼既笨重又低效。下面是 itertools 如何簡(jiǎn)化它的:

import itertools

# 生成兩個(gè)項(xiàng)目的所有可能組合
items = ['A', 'B', 'C']
combinations = itertools.combinations(items, 2)

for combo in combinations:
    print(combo)

在使用 itertools 之前,生成組合需要嵌套循環(huán),而且容易出錯(cuò):

items = ['A', 'B', 'C']
combinations = []

for i in range(len(items)):
    for j in range(i + 1, len(items)):
        combinations.append((items[i], items[j]))

for combo in combinations:
    print(combo)

itertools 使我的代碼更高效、更易讀。它對(duì)涉及復(fù)雜迭代的任務(wù)特別有用,比如生成用于算法測(cè)試的排列組合或創(chuàng)建用于數(shù)據(jù)分析的笛卡爾積。將 itertools 納入您的項(xiàng)目,性能和簡(jiǎn)潔性將得到顯著提高!

秘訣 9:types.MappingProxyType映射代理類型

有次我遇到了防止字典意外修改的需求,types.MappingProxyType為我提供了絕佳解決方案。它能創(chuàng)建字典的只讀映射視圖,確保底層字典的內(nèi)容永保不變。

示例

我正在做一個(gè)項(xiàng)目,其中的配置設(shè)置必須在整個(gè)執(zhí)行過程中保持不變。下面是 MappingProxyType 的功能:

from types import MappingProxyType

# 原始字典
config = {'host': 'localhost', 'port':8080}

# 創(chuàng)建只讀視圖
read_only_config = MappingProxyType(config)

print(read_only_config['host']) # 輸出:localhost

# 嘗試修改只讀字典
try:
    read_only_config['host'] = '127.0.0.1'
except TypeError as e:
    print(e)  # Output: 'mappingproxy' object does not support item assignment

在使用 MappingProxyType 之前,我一直擔(dān)心字典會(huì)被更改:

config = {'host': 'localhost', 'port': 8080}

# 沒有防止意外修改的保護(hù)措施
config['host'] = '127.0.0.1'

通過使用 types.MappingProxyType 我確保了配置設(shè)置的安全,避免了意外更改。在必須保護(hù)關(guān)鍵數(shù)據(jù)結(jié)構(gòu)的情況下,這種技術(shù)尤其有用。試一試,就能增強(qiáng)代碼的安全性和穩(wěn)定性!

秘訣 10:pathlib模塊

pathlib模塊則是現(xiàn)代化的文件路徑操作利器。相較于os.path,它采用了面向?qū)ο蟮姆绞?,操作更加易讀,也降低了出錯(cuò)風(fēng)險(xiǎn),成為文件路徑處理的不二選擇。

示例

我曾經(jīng)使用 os.path 來處理文件操作,但我的代碼往往雜亂無章,難以閱讀。下面是 pathlib 如何改進(jìn)它的:

from pathlib import Path

# 創(chuàng)建路徑對(duì)象
path = Path('example_directory/example_file.txt')

# 檢查路徑是否存在
if path.exists():
    print(f"{path} exists")

# 從文件中讀取文本
content = path.read_text()
print(content)

# 將文本寫入文件
path.write_text('Hello, world!')

在使用 pathlib 之前,我的代碼中充滿了 os.path 函數(shù):

import os

path = 'example_directory/example_file.txt'

# 檢查路徑是否存在
if os.path.exists(path):
    print(f"{path} exists")

# 從文件中讀取文本
with open(path, 'r') as file:
    content = file.read()
    print(content)

# 將文本寫入文件
with open(path, 'w') as file:
    file.write('Hello, world!')

使用 pathlib 使我的文件操作更簡(jiǎn)潔、更直觀。它對(duì)于管理文件路徑和簡(jiǎn)化文件處理任務(wù)尤其有用。試試 pathlib,看看它如何簡(jiǎn)化你的代碼!

責(zé)任編輯:武曉燕 來源: 數(shù)據(jù)STUDIO
相關(guān)推薦

2023-06-27 17:42:24

JavaScript編程語言

2017-07-20 14:03:23

2013-07-16 13:34:03

app成功秘訣

2013-07-17 17:30:44

成功appapp推廣移動(dòng)互聯(lián)網(wǎng)創(chuàng)業(yè)

2023-05-24 10:24:56

代碼Python

2015-06-24 10:07:34

Java編碼最佳實(shí)踐

2022-08-20 19:12:22

編程竅門

2021-09-15 09:20:37

Python函數(shù)代碼

2022-04-24 10:12:25

Python軟件包代碼

2023-07-17 17:50:42

2024-10-08 05:00:00

PEP 8編碼Python

2024-12-03 14:33:42

Python遞歸編程

2023-12-15 10:42:05

2022-02-22 23:25:19

Python編程語言開發(fā)

2024-07-18 15:08:27

2024-08-26 14:57:36

2021-12-02 14:55:44

Python項(xiàng)目編程語言

2023-06-27 15:50:23

Python圖像處理

2024-04-28 10:00:24

Python數(shù)據(jù)可視化庫(kù)圖像處理庫(kù)

2022-05-12 08:12:51

PythonPip技巧
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)