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

python使用數(shù)字與字符串方法技巧

 更新時間:2022年03月18日 10:14:33   作者:Steven迪文  
這篇文章主要介紹了python使用數(shù)字與字符串方法技巧,文章內(nèi)容介紹詳細(xì)具有一的參考價值,需要的小伙伴可以參考一下

1. 少使用數(shù)字字面量

下面的代碼使用數(shù)字來作為判斷條件的語句,如果你從別人手里接手過這部分代碼,很難第一時間理解它的意義。

def mark_trip_as_featured(trip):
? ? """將某個旅程添加到推薦欄目
? ? """
? ? if trip.source == 11:
? ? ? ? do_some_thing(trip)
? ? elif trip.source == 12:
? ? ? ? do_some_other_thing(trip)
? ? ... ...
? ? return

我們可以使用枚舉的方式,對這些數(shù)字部分做一些說明。

from enum import IntEnum

class TripSource(IntEnum):
? ? FROM_WEBSITE = 11
? ? FROM_IOS_CLIENT = 12


def mark_trip_as_featured(trip):
? ? if trip.source == TripSource.FROM_WEBSITE:
? ? ? ? do_some_thing(trip)
? ? elif trip.source == TripSource.FROM_IOS_CLIENT:
? ? ? ? do_some_other_thing(trip)
? ? ... ...
? ? return

將重復(fù)出現(xiàn)的數(shù)字定義成枚舉類型,不僅改善了代碼的可讀性,還降低了代碼出現(xiàn) Bug 的機(jī)率。

當(dāng)然不是所有的數(shù)字都需要用到枚舉說明,像常見數(shù)字下標(biāo) 0 和 -1
就不需要。

2. 裸字符串處理的問題

“ 裸字符串處理 ” 這里指只使用基本的加減乘除和循環(huán)、配合內(nèi)置函數(shù)/方法來操作字符串,獲得我們需要的結(jié)果。

def fetch_users(conn, min_level=None, gender=None, has_membership=False, sort_field="created"):
? ? """獲取用戶列表
? ?
? ? :param int min_level: 要求的最低用戶級別,默認(rèn)為所有級別
? ? :param int gender: 篩選用戶性別,默認(rèn)為所有性別
? ? :param int has_membership: 篩選所有會員/非會員用戶,默認(rèn)非會員
? ? :param str sort_field: 排序字段,默認(rèn)為按 created "用戶創(chuàng)建日期"
? ? :returns: 列表:[(User ID, User Name), ...]
? ? """
? ? # 一種古老的 SQL 拼接技巧,使用 "WHERE 1=1" 來簡化字符串拼接操作
? ? # 區(qū)分查詢 params 來避免 SQL 注入問題
? ? statement = "SELECT id, name FROM users WHERE 1=1"
? ? params = []
? ? if min_level is not None:
? ? ? ? statement += " AND level >= ?"
? ? ? ? params.append(min_level)
? ? if gender is not None:
? ? ? ? statement += " AND gender >= ?"
? ? ? ? params.append(gender)
? ? if has_membership:
? ? ? ? statement += " AND has_membership == true"
? ? else:
? ? ? ? statement += " AND has_membership == false"
? ??
? ? statement += " ORDER BY ?"
? ? params.append(sort_field)
? ? return list(conn.execute(statement, params))

這樣做雖然看起來簡單,符合直覺,但是隨著函數(shù)邏輯變得復(fù)雜,這段代碼會變得容易出錯。

更好的選擇是利用一些開源的對象化模塊來操作他們。
這里使用了 SQLAlchemy。

def fetch_users_v2(conn, min_level=None, gender=None, has_membership=False, sort_field="created"):
? ? """獲取用戶列表
? ? """
? ? query = select([users.c.id, users.c.name])
? ? if min_level is not None:
? ? ? ? query = query.where(users.c.level >= min_level)
? ? if gender is not None:
? ? ? ? query = query.where(users.c.gender == gender)
? ? query = query.where(users.c.has_membership == has_membership).order_by(users.c[sort_field])
? ? return list(conn.execute(query))

其它的替換思路:

Q: 目標(biāo)/源字符串是結(jié)構(gòu)化的,遵循某種格式嗎?

其它的開源的對象化模塊。

  • SQL:SQLAlchemy
  • XML:lxml
  • JSON、YAML …

嘗試使用模板引擎而不是復(fù)雜字符串處理邏輯來達(dá)到目的。

  • Jinja2
  • Mako
  • Mustache

3. 展開復(fù)雜的計算字面量表達(dá)式

def f1(delta_seconds):
? ? # 如果時間已經(jīng)過去了超過 11 天,不做任何事
? ? if delta_seconds > 950400:
? ? ? ? return?
? ? ...

“為什么我們不直接把代碼寫成 if delta_seconds < 11 * 24 * 3600: 呢?”

“性能”,答案一定會是“性能”。 Python 是一門解釋型語言,所以預(yù)先計算出 950400 正是因為我們不想讓每次對函數(shù) f1 的調(diào)用都帶上這部分的計算開銷。

不過事實是:即使我們把代碼改成 if delta_seconds < 11 * 24 * 3600:,函數(shù)也不會多出任何額外的開銷。

當(dāng)我們的代碼中需要出現(xiàn)復(fù)雜計算的字面量時,請保留整個算式吧。它對性能沒有任何影響,而且會增加代碼的可讀性。

def f1(delta_seconds):
? ? if delta_seconds < 11 * 24 * 3600:
? ? ? ? return

4.實用技巧

4.1布爾值也是數(shù)字

True False 可以當(dāng)成 1 和 0 使用

>>> True + 1
2
>>> 1 / False
Traceback (most recent call last):
? File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

計數(shù)簡化操作。

>>> l = [1, 2, 4, 5, 7]
>>> sum(i % 2 == 0 for i in l)
2

如果將某個布爾值表達(dá)式作為列表的下標(biāo)使用,可以實現(xiàn)類似三元表達(dá)式的目的:

# 類似的三元表達(dá)式:"Javascript" if 2 > 1 else "Python"
>>> ["Python", "Javascript"][2 > 1]
'Javascript'

4.2改善字符串的可讀性。

對于字符串我們常使用 \ 和 + 來講字符串拆分成好幾段。

還有一種簡單的方法是用 ()。
用 ()括起來就可以隨意拆行了。

s = (
? ? "There is something really bad happened during the process. "
? ? "Please contact your administrator."
)

對于多級縮進(jìn)字符串:

可以調(diào)用其他的標(biāo)準(zhǔn)庫來達(dá)到簡化效果。

from textwrap import dedent

def main():
? ? if user.is_active:
? ? ? ? # dedent 將會縮進(jìn)掉整段文字最左邊的空字符串
? ? ? ? message = dedent("""\
? ? ? ? ? ? Welcome, today's movie list:
? ? ? ? ? ? - Jaw (1975)
? ? ? ? ? ? - The Shining (1980)
? ? ? ? ? ? - Saw (2004)""")

大數(shù)字也可以變得更加可閱讀:

在數(shù)字之間加入下劃線。

>>> 10_000_000.0 ?# 以“千”為單位劃分?jǐn)?shù)字
10000000.0
>>> 0xCAFE_F00D ?# 16進(jìn)制數(shù)字同樣有效,4個一組更易讀
3405705229
>>> 0b_0011_1111_0100_1110 ?# 二進(jìn)制也有效
16206
>>> int('0b_1111_0000', 2) ?# 處理字符串的時候也會正確處理下劃線
240

4.3以 r 開頭的內(nèi)建字符串函數(shù)。

例如 : .split() 和 .rsplit() 的區(qū)別是,一個從左到右分割字符串,另一個是從右到左處理字符串。

合理使用一些現(xiàn)成 string 操作函數(shù)可以讓工作事半功倍。

4.4 float (" inf ")

float ( " inf " ) float ( " -inf ") ,對應(yīng)著無窮大和無窮小。

float( " -inf ") < 任意數(shù)值 < float( " inf ")

一些可以用上的場合。

# A. 根據(jù)年齡升序排序,沒有提供年齡放在最后邊
>>> users = {"tom": 19, "jenny": 13, "jack": None, "andrew": 43}
>>> sorted(users.keys(), key=lambda user: users.get(user) or float('inf'))
['jenny', 'tom', 'andrew', 'jack']

# B. 作為循環(huán)初始值,簡化第一次判斷邏輯
>>> max_num = float('-inf')
>>> # 找到列表中最大的數(shù)字
>>> for i in [23, 71, 3, 21, 8]:
...: ? ?if i > max_num:
...: ? ? ? ? max_num = i
...:
>>> max_num
71

5.常見誤區(qū)

5.1“value += 1” 并非線程安全

如下:這個操作并不是線程安全的。

這個簡單的累加語句,會被編譯成包括取值和保存在內(nèi)的好幾個不同步驟。

而在多線程環(huán)境下,任意一個其他線程都有可能在其中某個步驟切入進(jìn)來,阻礙你獲得正確的結(jié)果。

def incr(value):
? ? value += 1


# 使用 dis 模塊查看字節(jié)碼
import dis

dis.dis(incr)
? ? ? 0 LOAD_FAST ? ? ? ? ? ? ? ?0 (value)
? ? ? 2 LOAD_CONST ? ? ? ? ? ? ? 1 (1)
? ? ? 4 INPLACE_ADD
? ? ? 6 STORE_FAST ? ? ? ? ? ? ? 0 (value)
? ? ? 8 LOAD_CONST ? ? ? ? ? ? ? 0 (None)
? ? ?10 RETURN_VALUE

常用 dis 模塊去驗證自己的操作,有時候,結(jié)果和我們預(yù)想的并不一樣。

5.2字符串拼接并不慢

Python 的字符串拼接(+=)在 2.2 以及之前的版本確實很慢。
但之后的版本做了更新,效率已經(jīng)大大提升,所有字符串的拼接還是可以使用的。

到此這篇關(guān)于python使用數(shù)字與字符串方法技巧的文章就介紹到這了,更多相關(guān)python數(shù)字與字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python中string模塊各屬性以及函數(shù)的用法介紹

    python中string模塊各屬性以及函數(shù)的用法介紹

    下面小編就為大家?guī)硪黄猵ython中string模塊各屬性以及函數(shù)的用法介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • 將keras的h5模型轉(zhuǎn)換為tensorflow的pb模型操作

    將keras的h5模型轉(zhuǎn)換為tensorflow的pb模型操作

    這篇文章主要介紹了將keras的h5模型轉(zhuǎn)換為tensorflow的pb模型操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • pandas 將索引值相加的方法

    pandas 將索引值相加的方法

    今天小編就為大家分享一篇pandas 將索引值相加的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • 在ubuntu16.04中將python3設(shè)置為默認(rèn)的命令寫法

    在ubuntu16.04中將python3設(shè)置為默認(rèn)的命令寫法

    這篇文章主要介紹了在ubuntu16.04中將python3設(shè)置為默認(rèn)python的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-10-10
  • python學(xué)習(xí)之讀取配置文件

    python學(xué)習(xí)之讀取配置文件

    這篇文章主要介紹了python學(xué)習(xí)之讀取配置文件,文章基于python的相關(guān)資料展開對主題的詳細(xì)介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • Python實現(xiàn)屏幕錄制功能的代碼

    Python實現(xiàn)屏幕錄制功能的代碼

    這篇文章主要介紹了Python實現(xiàn)屏幕錄制功能,本文給大家介紹的非常詳細(xì),對大家的工作或?qū)W習(xí)具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • 使用Pytorch實現(xiàn)Swish激活函數(shù)的示例詳解

    使用Pytorch實現(xiàn)Swish激活函數(shù)的示例詳解

    激活函數(shù)是人工神經(jīng)網(wǎng)絡(luò)的基本組成部分,他們將非線性引入模型,使其能夠?qū)W習(xí)數(shù)據(jù)中的復(fù)雜關(guān)系,Swish 激活函數(shù)就是此類激活函數(shù)之一,在本文中,我們將深入研究 Swish 激活函數(shù),提供數(shù)學(xué)公式,探索其相對于 ReLU 的優(yōu)勢,并使用 PyTorch 演示其實現(xiàn)
    2023-11-11
  • python調(diào)用golang中函數(shù)方法

    python調(diào)用golang中函數(shù)方法

    由于simhash方法有多種實現(xiàn)方式,現(xiàn)python中simhash方法與golang中的不一樣,需要兩者代碼生成結(jié)果保持一致,故采用python中的代碼調(diào)用golang編譯的so文件來實現(xiàn),需要的朋友可以參考下
    2024-02-02
  • python 如何在 Matplotlib 中繪制垂直線

    python 如何在 Matplotlib 中繪制垂直線

    這篇文章主要介紹了python 如何在 Matplotlib 中繪制垂直線,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • python 的 scapy庫,實現(xiàn)網(wǎng)卡收發(fā)包的例子

    python 的 scapy庫,實現(xiàn)網(wǎng)卡收發(fā)包的例子

    今天小編就為大家分享一篇python 的 scapy庫,實現(xiàn)網(wǎng)卡收發(fā)包的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評論