python使用数字与字符串方法技巧有哪些

python使用数字与字符串方法技巧有哪些

这篇文章主要介绍了python使用数字与字符串方法技巧有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1. 少使用数字字面量

下面的代码使用数字来作为判断条件的语句,如果你从别人手里接手过这部分代码,很难第一时间理解它的意义。

python使用数字与字符串方法技巧有哪些

defmark_trip_as_featured(trip):"""将某个旅程添加到推荐栏目"""iftrip.source==11:do_some_thing(trip)eliftrip.source==12:do_some_other_thing(trip)......return

我们可以使用枚举的方式,对这些数字部分做一些说明。

fromenumimportIntEnumclassTripSource(IntEnum):FROM_WEBSITE=11FROM_IOS_CLIENT=12defmark_trip_as_featured(trip):iftrip.source==TripSource.FROM_WEBSITE:do_some_thing(trip)eliftrip.source==TripSource.FROM_IOS_CLIENT:do_some_other_thing(trip)......return

将重复出现的数字定义成枚举类型,不仅改善了代码的可读性,还降低了代码出现 Bug 的机率。

当然不是所有的数字都需要用到枚举说明,像常见数字下标 0 和 -1
就不需要。

2. 裸字符串处理的问题

“ 裸字符串处理 ” 这里指只使用基本的加减乘除和循环、配合内置函数/方法来操作字符串,获得我们需要的结果。

deffetch_users(conn,min_level=None,gender=None,has_membership=False,sort_field="created"):"""获取用户列表:paramintmin_level:要求的最低用户级别,默认为所有级别:paramintgender:筛选用户性别,默认为所有性别:paraminthas_membership:筛选所有会员/非会员用户,默认非会员:paramstrsort_field:排序字段,默认为按created"用户创建日期":returns:列表:[(UserID,UserName),...]"""#一种古老的SQL拼接技巧,使用"WHERE1=1"来简化字符串拼接操作#区分查询params来避免SQL注入问题statement="SELECTid,nameFROMusersWHERE1=1"params=[]ifmin_levelisnotNone:statement+="ANDlevel>=?"params.append(min_level)ifgenderisnotNone:statement+="ANDgender>=?"params.append(gender)ifhas_membership:statement+="ANDhas_membership==true"else:statement+="ANDhas_membership==false"statement+="ORDERBY?"params.append(sort_field)returnlist(conn.execute(statement,params))

这样做虽然看起来简单,符合直觉,但是随着函数逻辑变得复杂,这段代码会变得容易出错。

更好的选择是利用一些开源的对象化模块来操作他们。
这里使用了 SQLAlchemy

deffetch_users_v2(conn,min_level=None,gender=None,has_membership=False,sort_field="created"):"""获取用户列表"""query=select([users.c.id,users.c.name])ifmin_levelisnotNone:query=query.where(users.c.level>=min_level)ifgenderisnotNone:query=query.where(users.c.gender==gender)query=query.where(users.c.has_membership==has_membership).order_by(users.c[sort_field])returnlist(conn.execute(query))

其它的替换思路:

Q: 目标/源字符串是结构化的,遵循某种格式吗?

其它的开源的对象化模块。

  • SQL:SQLAlchemy

  • XML:lxml

  • JSON、YAML …

尝试使用模板引擎而不是复杂字符串处理逻辑来达到目的。

  • Jinja2

  • Mako

  • Mustache

3. 展开复杂的计算字面量表达式

deff1(delta_seconds):#如果时间已经过去了超过11天,不做任何事ifdelta_seconds>950400:return...

“为什么我们不直接把代码写成 if delta_seconds < 11 * 24 * 3600: 呢?”

“性能”,答案一定会是“性能”。 Python 是一门解释型语言,所以预先计算出 950400 正是因为我们不想让每次对函数 f1 的调用都带上这部分的计算开销。

不过事实是:即使我们把代码改成 if delta_seconds < 11 * 24 * 3600:,函数也不会多出任何额外的开销。

当我们的代码中需要出现复杂计算的字面量时,请保留整个算式吧。它对性能没有任何影响,而且会增加代码的可读性。

deff1(delta_seconds):ifdelta_seconds<11*24*3600:return

4.实用技巧

4.1布尔值也是数字

True False 可以当成 1 和 0 使用

>>>True+12>>>1/FalseTraceback(mostrecentcalllast):File"<stdin>",line1,in<module>ZeroDivisionError:divisionbyzero

计数简化操作。

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

如果将某个布尔值表达式作为列表的下标使用,可以实现类似三元表达式的目的:

#类似的三元表达式:"Javascript"if2>1else"Python">>>["Python","Javascript"][2>1]'Javascript'

4.2改善字符串的可读性。

对于字符串我们常使用 \ 和 + 来讲字符串拆分成好几段。

还有一种简单的方法是用 ()。
用 ()括起来就可以随意拆行了。

s=("Thereissomethingreallybadhappenedduringtheprocess.""Pleasecontactyouradministrator.")

对于多级缩进字符串:

可以调用其他的标准库来达到简化效果。

fromtextwrapimportdedentdefmain():ifuser.is_active:#dedent将会缩进掉整段文字最左边的空字符串message=dedent("""\Welcome,today'smovielist:-Jaw(1975)-TheShining(1980)-Saw(2004)""")

大数字也可以变得更加可阅读:

在数字之间加入下划线。

>>>10_000_000.0#以“千”为单位划分数字10000000.0>>>0xCAFE_F00D#16进制数字同样有效,4个一组更易读3405705229>>>0b_0011_1111_0100_1110#二进制也有效16206>>>int('0b_1111_0000',2)#处理字符串的时候也会正确处理下划线240

4.3以 r 开头的内建字符串函数。

例如 : .split() 和 .rsplit() 的区别是,一个从左到右分割字符串,另一个是从右到左处理字符串。

合理使用一些现成 string 操作函数可以让工作事半功倍。

4.4 float (" inf ")

float ( " inf " ) float ( " -inf ") ,对应着无穷大和无穷小。

float( " -inf ") < 任意数值 < float( " inf ")

一些可以用上的场合。

#A.根据年龄升序排序,没有提供年龄放在最后边>>>users={"tom":19,"jenny":13,"jack":None,"andrew":43}>>>sorted(users.keys(),key=lambdauser:users.get(user)orfloat('inf'))['jenny','tom','andrew','jack']#B.作为循环初始值,简化第一次判断逻辑>>>max_num=float('-inf')>>>#找到列表中最大的数字>>>foriin[23,71,3,21,8]:...:ifi>max_num:...:max_num=i...:>>>max_num71

5.常见误区

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

如下:这个操作并不是线程安全的。

这个简单的累加语句,会被编译成包括取值和保存在内的好几个不同步骤。

而在多线程环境下,任意一个其他线程都有可能在其中某个步骤切入进来,阻碍你获得正确的结果。

defincr(value):value+=1#使用dis模块查看字节码importdisdis.dis(incr)0LOAD_FAST0(value)2LOAD_CONST1(1)4INPLACE_ADD6STORE_FAST0(value)8LOAD_CONST0(None)10RETURN_VALUE

常用 dis 模块去验证自己的操作,有时候,结果和我们预想的并不一样。

5.2字符串拼接并不慢

Python 的字符串拼接(+=)在 2.2 以及之前的版本确实很慢。
但之后的版本做了更新,效率已经大大提升,所有字符串的拼接还是可以使用的。

感谢你能够认真阅读完这篇文章,希望小编分享的“python使用数字与字符串方法技巧有哪些”这篇文章对大家有帮助,同时也希望大家多多支持恰卡编程网,关注恰卡编程网行业资讯频道,更多相关知识等着你来学习!

发布于 2022-03-18 22:52:11
收藏
分享
海报
0 条评论
29
上一篇:Unity如何实现射击小游戏 下一篇: python中的条件判断语句怎么用
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码