Maison développement back-end Tutoriel Python 20 conseils d'utilisation de Python, recommandés à collectionner !

20 conseils d'utilisation de Python, recommandés à collectionner !

Aug 09, 2023 pm 05:42 PM
python


1. Opérations déroutantes

Cette section compare certaines opérations déroutantes de Python.

1.1 Échantillonnage aléatoire avec remplacement et échantillonnage aléatoire sans remplacement

import random
random.choices(seq, k=1)  # 长度为k的list,有放回采样
random.sample(seq, k)     # 长度为k的list,无放回采样

1.2 Paramètres de la fonction lambda

func = lambda y: x + y          # x的值在函数运行时被绑定
func = lambda y, x=x: x + y     # x的值在函数定义时被绑定

1.3 copie et deepcopy

import copy
y = copy.copy(x)      # 只复制最顶层
y = copy.deepcopy(x)  # 复制所有嵌套部分

Copie et alias variable Lorsqu'ils sont combinés ensemble, il est facile de confondre :

a = [1, 2, [3, 4]]

# Alias.
b_alias = a  
assert b_alias == a and b_alias is a

# Shallow copy.
b_shallow_copy = a[:]  
assert b_shallow_copy == a and b_shallow_copy is not a and b_shallow_copy[2] is a[2]

# Deep copy.
import copy
b_deep_copy = copy.deepcopy(a)  
assert b_deep_copy == a and b_deep_copy is not a and b_deep_copy[2] is not a[2]

La modification de l'alias affectera la variable d'origine. Les éléments de la copie (superficielle) sont des alias des éléments de la liste d'origine, tandis que la copie profonde copie de manière récursive, et les modifications de la copie complète n'affectent pas les variables d'origine.

2、常用工具

2.1 读写 CSV 文件

import csv
# 无header的读写
with open(name, 'rt', encoding='utf-8', newline='') as f:  # newline=''让Python不将换行统一处理
    for row in csv.reader(f):
        print(row[0], row[1])  # CSV读到的数据都是str类型
with open(name, mode='wt') as f:
    f_csv = csv.writer(f)
    f_csv.writerow(['symbol', 'change'])

# 有header的读写
with open(name, mode='rt', newline='') as f:
    for row in csv.DictReader(f):
        print(row['symbol'], row['change'])
with open(name, mode='wt') as f:
    header = ['symbol', 'change']
    f_csv = csv.DictWriter(f, header)
    f_csv.writeheader()
    f_csv.writerow({'symbol': xx, 'change': xx})

注意,当 CSV 文件过大时会报错:_csv.Error: field larger than field limit (131072),通过修改上限解决

import sys
csv.field_size_limit(sys.maxsize)

csv 还可以读以 \t 分割的数据

f = csv.reader(f, delimiter='\t')

2.2 迭代器工具

itertools 中定义了很多迭代器工具,例如子序列工具:

import itertools
itertools.islice(iterable, start=None, stop, step=None)
# islice('ABCDEF', 2, None) -> C, D, E, F

itertools.filterfalse(predicate, iterable)         # 过滤掉predicate为False的元素
# filterfalse(lambda x: x < 5, [1, 4, 6, 4, 1]) -> 6

itertools.takewhile(predicate, iterable)           # 当predicate为False时停止迭代
# takewhile(lambda x: x < 5, [1, 4, 6, 4, 1]) -> 1, 4

itertools.dropwhile(predicate, iterable)           # 当predicate为False时开始迭代
# dropwhile(lambda x: x < 5, [1, 4, 6, 4, 1]) -> 6, 4, 1

itertools.compress(iterable, selectors)            # 根据selectors每个元素是True或False进行选择
# compress(&#39;ABCDEF&#39;, [1, 0, 1, 0, 1, 1]) -> A, C, E, F

序列排序:

sorted(iterable, key=None, reverse=False)

itertools.groupby(iterable, key=None)              # 按值分组,iterable需要先被排序
# groupby(sorted([1, 4, 6, 4, 1])) -> (1, iter1), (4, iter4), (6, iter6)

itertools.permutations(iterable, r=None)           # 排列,返回值是Tuple
# permutations(&#39;ABCD&#39;, 2) -> AB, AC, AD, BA, BC, BD, CA, CB, CD, DA, DB, DC

itertools.combinations(iterable, r=None)           # 组合,返回值是Tuple
itertools.combinations_with_replacement(...)
# combinations(&#39;ABCD&#39;, 2) -> AB, AC, AD, BC, BD, CD

多个序列合并:

itertools.chain(*iterables)                        # 多个序列直接拼接
# chain(&#39;ABC&#39;, &#39;DEF&#39;) -> A, B, C, D, E, F

import heapq
heapq.merge(*iterables, key=None, reverse=False)   # 多个序列按顺序拼接
# merge(&#39;ABF&#39;, &#39;CDE&#39;) -> A, B, C, D, E, F

zip(*iterables)                                    # 当最短的序列耗尽时停止,结果只能被消耗一次
itertools.zip_longest(*iterables, fillvalue=None)  # 当最长的序列耗尽时停止,结果只能被消耗一次

2.3 计数器

计数器可以统计一个可迭代对象中每个元素出现的次数。

import collections
# 创建
collections.Counter(iterable)

# 频次
collections.Counter[key]                 # key出现频次
# 返回n个出现频次最高的元素和其对应出现频次,如果n为None,返回所有元素
collections.Counter.most_common(n=None)

# 插入/更新
collections.Counter.update(iterable)
counter1 + counter2; counter1 - counter2  # counter加减

# 检查两个字符串的组成元素是否相同
collections.Counter(list1) == collections.Counter(list2)

2.4 带默认值的 Dict

当访问不存在的 Key 时,defaultdict 会将其设置为某个默认值。

import collections
collections.defaultdict(type)  # 当第一次访问dict[key]时,会无参数调用type,给dict[key]提供一个初始值

2.5 有序 Dict

import collections
collections.OrderedDict(items=None)  # 迭代时保留原始插入顺序

3、高性能编程和调试

3.1 输出错误和警告信息

向标准错误输出信息

import sys
sys.stderr.write(&#39;&#39;)

输出警告信息

import warnings
warnings.warn(message, category=UserWarning)  
# category的取值有DeprecationWarning, SyntaxWarning, RuntimeWarning, ResourceWarning, FutureWarning

控制警告消息的输出

$ python -W all     # 输出所有警告,等同于设置warnings.simplefilter(&#39;always&#39;)
$ python -W ignore  # 忽略所有警告,等同于设置warnings.simplefilter(&#39;ignore&#39;)
$ python -W error   # 将所有警告转换为异常,等同于设置warnings.simplefilter(&#39;error&#39;)

3.2 代码中测试

有时为了调试,我们想在代码中加一些代码,通常是一些 print 语句,可以写为:

# 在代码中的debug部分
if __debug__:
    pass

一旦调试结束,通过在命令行执行 -O 选项,会忽略这部分代码:

$ python -0 main.py

3.3 代码风格检查

使用 pylint 可以进行不少的代码风格和语法检查,能在运行之前发现一些错误

pylint main.py

3.4 代码耗时

耗时测试

$ python -m cProfile main.py

测试某代码块耗时

# 代码块耗时定义
from contextlib import contextmanager
from time import perf_counter

@contextmanager
def timeblock(label):
    tic = perf_counter()
    try:
        yield
    finally:
        toc = perf_counter()
        print(&#39;%s : %s&#39; % (label, toc - tic))

# 代码块耗时测试
with timeblock(&#39;counting&#39;):
    pass

代码耗时优化的一些原则

  • Concentrez-vous sur l'optimisation des goulots d'étranglement des performances, et non sur l'intégralité du code.
  • Évitez d'utiliser des variables globales. Les variables locales sont recherchées plus rapidement que les variables globales, et l'exécution du code définissant les variables globales dans une fonction est généralement 15 à 30 % plus rapide.
  • Évitez d'utiliser . Il sera plus rapide d'utiliser from module import name pour placer la variable membre de classe fréquemment consultée self.member dans une variable locale.
  • Essayez d'utiliser des structures de données intégrées. str, list, set, dict, etc. sont implémentés en C et s'exécutent très rapidement.
  • Évitez de créer des variables intermédiaires inutiles et copy.deepcopy().
  • La concaténation de chaînes, telle que a + ':' + b + ':' + c créera beaucoup de variables intermédiaires inutiles, ':',join([a, b, c]) ne le sera pas quelques-uns efficaces. De plus, vous devez déterminer si la concaténation de chaînes est nécessaire. Par exemple, print(':'.join([a, b, c])) est moins efficace que print(a, b, c, sep=':' ).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Oguri Cap Build Guide | Un joli Musume Derby
3 Il y a quelques semaines By Jack chen
Guide de construction d'Agnes Tachyon | Un joli Musume Derby
2 Il y a quelques semaines By Jack chen
Guide de construction de Grass Wonder | Uma musume joli derby
2 Il y a quelques semaines By Jack chen
Pic comment émoter
4 Il y a quelques semaines By Jack chen

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Une classe Python peut-elle avoir plusieurs constructeurs? Une classe Python peut-elle avoir plusieurs constructeurs? Jul 15, 2025 am 02:54 AM

Oui, apythonclasscanhavemultipleconstructorshroughalterativetechniques.1.UseaultArgumentsInthe__Init__MethodtoallowflexibleInitializationwithVaryingNumbersofParameters.2.DefineclassMethodsAnterveConstructorForCeleArandScalableableBjectCraturé

Python pour la gamme de boucle Python pour la gamme de boucle Jul 14, 2025 am 02:47 AM

Dans Python, l'utilisation d'une boucle pour la fonction avec la plage () est un moyen courant de contrôler le nombre de boucles. 1. Utilisez lorsque vous connaissez le nombre de boucles ou avez besoin d'accès aux éléments par index; 2. Plage (arrêt) de 0 à l'arrêt-1, plage (démarrage, arrêt) du début à l'arrêt-1, plage (démarrage, arrêt) ajoute la taille de l'étape; 3. Notez que la plage ne contient pas la valeur finale et renvoie des objets itérables au lieu de listes dans Python 3; 4. Vous pouvez vous convertir en liste via la liste (plage ()) et utiliser la taille de pas négative dans l'ordre inverse.

Accéder aux données à partir d'une API Web dans Python Accéder aux données à partir d'une API Web dans Python Jul 16, 2025 am 04:52 AM

La clé de l'utilisation de Python pour appeler WebAPI pour obtenir des données est de maîtriser les processus de base et les outils communs. 1. L'utilisation des demandes pour lancer des demandes HTTP est le moyen le plus direct. Utilisez la méthode GET pour obtenir la réponse et utilisez JSON () pour analyser les données; 2. Pour les API qui nécessitent une authentification, vous pouvez ajouter des jetons ou des clés via des en-têtes; 3. Vous devez vérifier le code d'état de réponse, il est recommandé d'utiliser Response.RAISE_FOR_STATUS () pour gérer automatiquement les exceptions; 4. Face à l'interface de pagination, vous pouvez demander différentes pages et ajouter des retards pour éviter les limitations de fréquence; 5. Lors du traitement des données JSON renvoyées, vous devez extraire des informations en fonction de la structure et les données complexes peuvent être converties en données

python une ligne si d'autre python une ligne si d'autre Jul 15, 2025 am 01:38 AM

Python's Onelineifelse est un opérateur ternaire, écrit comme XifConditionelSey, qui est utilisé pour simplifier le jugement conditionnel simple. Il peut être utilisé pour une affectation variable, tel que status = "adulte" ifage> = 18Else "mineur"; Il peut également être utilisé pour renvoyer directement les résultats dans des fonctions, telles que Deget_Status (âge): renvoyer "adulte" ifage> = 18else "mineur"; Bien que l'utilisation imbriquée soit prise en charge, comme le résultat = "A" i

Comment lire un fichier JSON dans Python? Comment lire un fichier JSON dans Python? Jul 14, 2025 am 02:42 AM

La lecture des fichiers JSON peut être implémentée dans Python via le module JSON. Les étapes spécifiques sont les suivantes: utilisez la fonction Open () pour ouvrir le fichier, utilisez json.load () pour charger le contenu, et les données seront renvoyées dans un formulaire de dictionnaire ou de liste; Si vous traitez les chaînes JSON, vous devez utiliser JSON.loads (). Les problèmes communs incluent les erreurs de chemin de fichier, le format JSON incorrect, les problèmes de codage et les différences de conversion du type de données. Faites attention à la précision du chemin, à la légalité du format, aux paramètres d'encodage et à la cartographie des valeurs booléennes et null.

Python pour Loop pour lire la file ligne par ligne Python pour Loop pour lire la file ligne par ligne Jul 14, 2025 am 02:47 AM

L'utilisation d'une boucle pour lire les fichiers ligne par ligne est un moyen efficace de traiter les fichiers volumineux. 1. L'utilisation de base consiste à ouvrir le fichier via Openn () et à gérer automatiquement la fermeture. Combiné avec ForLineInfile pour traverser chaque ligne. line.strip () peut supprimer les ruptures de ligne et les espaces; 2. Si vous avez besoin d'enregistrer le numéro de ligne, vous pouvez utiliser l'énumération (fichier, start = 1) pour permettre au numéro de ligne de démarrer à partir de 1; 3. Lors du traitement des fichiers non ASCII, vous devez spécifier des paramètres d'encodage tels que UTF-8 pour éviter les erreurs de codage. Ces méthodes sont concises et pratiques, et conviennent à la plupart des scénarios de traitement de texte.

chaîne de cas de cas Python Comparez si chaîne de cas de cas Python Comparez si Jul 14, 2025 am 02:53 AM

Le moyen le plus direct de faire des comparaisons de chaînes insensibles à des cas dans Python est d'utiliser .Lower () ou .upper () à comparer. Par exemple: str1.lower () == str2.lower () peut déterminer s'il est égal; Deuxièmement, pour le texte multilingue, il est recommandé d'utiliser une méthode Casefold () plus approfondie, telle que "Straß" .Casefold () sera converti en "strasse", tandis que .Lower () peut conserver des caractères spécifiques; De plus, il doit être évité d'utiliser directement == Comparaison directement, à moins que le cas ne soit confirmé comme cohérent, il est facile de provoquer des erreurs logiques; Enfin, lors du traitement de la saisie, de la base de données ou de la correspondance des utilisateurs

Python a-t-il une surcharge de fonction Python a-t-il une surcharge de fonction Jul 14, 2025 am 02:35 AM

Non, PythondoOSNOTSUPPORTFUNTIONSORODOLODINGINTHETRADITIONALSENSE.1.UsingDefaultParameTetersallowssimulingOplowingByProvidingOptionalArguleswithDefaultValues.2.Utilisingargsand * KwargsoffersFlexibility ToHandleVaBlembersofargumentsBuTreQUiSinin

See all articles