输入一串字符串,输出字符串中的数字python,关于python字符串的操作方法
本文主要介绍python使用数字和字符串的技巧。文章的详细介绍很有参考价值,有需要的可以参考一下。
00-1010 1.较少使用数字文字2。裸字符串处理问题3。扩展用于计算文字的复杂表达式4。实用技巧4.1布尔值也是数字4.2提高字符串的可读性。4.3以R. 4.4 float ( inf )5开头的内置字符串函数。常见误解5.1“value=1”不是线程安全的5.2字符串拼接不慢
目录
下面的代码使用数字作为判断条件。如果你从别人那里接过了这部分代码,第一时间很难理解它的意思。
def mark _ trip _ as _ featured(trip):
在推荐栏中添加旅程。
if trip.source==11:
做某事(旅行)
elif trip.source==12:
做一些其他的事情(旅行)
.
返回
我们可以用枚举法来解释其中的一些数字。
从枚举导入意图
等级TripSource(IntEnum):
FROM_WEBSITE=11
FROM_IOS_CLIENT=12
def mark _ trip _ as _ featured(trip):
if trip.source==TripSource。FROM _网站:
做某事(旅行)
elif trip.source==TripSource。FROM_IOS_CLIENT:
做一些其他的事情(旅行)
.
返回
将重复数定义为枚举类型,不仅提高了代码的可读性,还降低了代码出现bug的概率。
当然,并不是所有的数字都需要枚举指令,比如常见的数字下标0和-1。
你不需要它。
1. 少使用数字字面量
这里的“裸字符串处理”是指只使用基本的加减乘除和循环,配合内置的函数/方法来操作字符串,得到我们需要的结果。
def fetch_users(conn,min_level=None,gender=None,has_membership=False,sort_field=created):
获取用户列表。
:param int min_level:所需的最低用户级别,默认为所有级别。
:param int gender:过滤用户性别,默认为所有性别
3360 param int has _ memberships 3360过滤所有成员/非成员用户,默认为非成员。
:param str sort_field:排序字段,默认为创建日期用户创建日期
:returns:列表:[(用户ID,用户名),]
#一种古老的SQL拼接技术,使用“WHERE 1=1”来简化字符串拼接。
#区分查询参数以避免SQL注入问题
statement=SELECT id,name FROM users WHERE 1=1
params=[]
如果min_level不为None:
语句=和级别=?
params.append(最小级别)
如果性别不是None:
语句=和性别=?
params.append(性别)
如果有_membership:
语句=和
has_membership == true"
else:
statement += " AND has_membership == false"
statement += " ORDER BY ?"
params.append(sort_field)
return list(conn.execute(statement, params))
这样做虽然看起来简单,符合直觉,但是随着函数逻辑变得复杂,这段代码会变得容易出错。
更好的选择是利用一些开源的对象化模块来操作他们。
这里使用了 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: 目标/源字符串是结构化的,遵循某种格式吗?
其它的开源的对象化模块。
- SQL:SQLAlchemy
- XML:lxml
- JSON、YAML …
尝试使用模板引擎而不是复杂字符串处理逻辑来达到目的。
- Jinja2
- Mako
- Mustache
3. 展开复杂的计算字面量表达式
def f1(delta_seconds):# 如果时间已经过去了超过 11 天,不做任何事
if delta_seconds > 950400:
return
...
为什么我们不直接把代码写成 if delta_seconds < 11 * 24 * 3600: 呢?
性能,答案一定会是性能。 Python 是一门解释型语言,所以预先计算出 950400 正是因为我们不想让每次对函数 f1 的调用都带上这部分的计算开销。
不过事实是:即使我们把代码改成 if delta_seconds < 11 * 24 * 3600:,函数也不会多出任何额外的开销。
当我们的代码中需要出现复杂计算的字面量时,请保留整个算式吧。它对性能没有任何影响,而且会增加代码的可读性。
def f1(delta_seconds):if delta_seconds < 11 * 24 * 3600:
return
4.实用技巧
4.1布尔值也是数字
True
和 False
可以当成 1 和 0 使用
>>> True + 12
>>> 1 / False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
计数简化操作。
>>> l = [1, 2, 4, 5, 7]>>> sum(i % 2 == 0 for i in l)
2
如果将某个布尔值表达式作为列表的下标使用,可以实现类似三元表达式的目的:
# 类似的三元表达式:"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."
)
对于多级缩进字符串:
可以调用其他的标准库来达到简化效果。
from textwrap import dedentdef main():
if user.is_active:
# dedent 将会缩进掉整段文字最左边的空字符串
message = dedent("""\
Welcome, todays movie list:
- Jaw (1975)
- The Shining (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=lambda user: users.get(user) or float(inf))
[jenny, tom, andrew, jack]
# B. 作为循环初始值,简化第一次判断逻辑
>>> max_num = float(-inf)
>>> # 找到列表中最大的数字
>>> for i in [23, 71, 3, 21, 8]:
...: if i > max_num:
...: max_num = i
...:
>>> max_num
71
5.常见误区
5.1value += 1 并非线程安全
如下:这个操作并不是线程安全的。
这个简单的累加语句,会被编译成包括取值和保存在内的好几个不同步骤。
而在多线程环境下,任意一个其他线程都有可能在其中某个步骤切入进来,阻碍你获得正确的结果。
def incr(value):value += 1
# 使用 dis 模块查看字节码
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
模块去验证自己的操作,有时候,结果和我们预想的并不一样。
5.2字符串拼接并不慢
Python 的字符串拼接(+=)在 2.2 以及之前的版本确实很慢。
但之后的版本做了更新,效率已经大大提升,所有字符串的拼接还是可以使用的。
到此这篇关于python使用数字与字符串方法技巧的文章就介绍到这了,更多相关python数字与字符串内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。