今日必看|这些鲜为人知的Python功能,你值得拥有!
全文共1583字 , 预计学习时长7分钟
本文插图
发现Python中的新功能是笔者的一大兴趣 , 每当碰到一些其他人没有留意到的某个功能时 , 我都会兴高采烈地把它记录下来 。
这不 , 过去几周我又了解到一些有趣的功能 , 例如StackOverflow上一些我不知道的功能 。 这些被低估和埋没的实用功能 , 你真的值得拥有!
divmod
这个函数非常有用 , 它能对两个数执行模除%运算 , 然后返回商和余数 。 例如:
divmod(5, 2)
[Out]: (2, 1)
这只是在找到可以将2拟合为5的次数 , 我们不需要拆分这个数 , 就可以得出商为2 , 1为余数 。 对于计算返回进程运行所需的时间(以小时、分钟和秒为单位)特别有用 , 就像这样:
start =datetime.datetime.now()...# process code goes hereend =datetime.datetime.now()# we get the total runtime in seconds
runtime = (end - start).seconds# wewill assume 30000# how many hours are in these secs, what are the remainingsecs?
hours, remainder = divmod(runtime, 3600)# now how many minutes and seconds arein our remainder?
mins, secs = divmod(remainder,60)print("{:02d}:{:02d}:{:02d}".format(hours, mins, secs))
[Out]: "08:00:08"
casefold
这是一个特别有趣的字符串方法 , 它的功能类似于lower 。, 但casefold试图更积极地标准化更广泛的字符 。 在大多数情况下 , lower和casefold的行为相同 , 但有时它们不相同:
"".casefold()# bothand σ are the Greek letter sigma[Out]:"σ"
相比之下 , 使用lower:
"".lower()# however, lower recognizes them as different[Out]:""
[Out]: False
在这里 , 两个sigma已经都是小写 。 根据使用情况 , 它可能会按预期运行 。 但是 , 假如打算比较两个等效的希腊语单词 , 一个使用σ , 另一个使用 。 尽管相同 , 但只有casefold才能让我们正确地比较它们:
"ρμησ" == "ρμη"
[Out]:False
"ρμησ".lower() == "ρμη".lower()
[Out]:False
"ρμησ".casefold() == "ρμη".casefold()
[Out]:True
*args, **kwargs
有时你可能会看到函数定义包含这两个参数 , 例如 def func(x , y , * args , ** kwargs) 。
它们都非常简单 , 两者都答应我们将多个值传递给一个函数 , 然后将其打包到一个生成器中 。 关于是否将列表/生成器传递给尺度参数 , 其结果是这样的:
def func(values):
for x in values:
print(x, end=" ")func([1,2, 3])
[Out]: "1 2 3 "
使用* args 时 , 我们应该将每个值作为新参数传递 , 而不是将它们全部包含在列表中 。
def func(*values):
for x in values:
print(x, end=" ")func(1,2, 3)
[Out]: 1 2 3
留意 , 不需要输入* args , 只需输入* values 。 因为单个星号* , 它被定义为* args , 这和使用的变量名称无关 。 * args只是根据传递给函数的参数创建一个生成器对象 。 ** kwargs创建字典 。
因此 , 可以这样使用名称、关键字参数:
def func(**values):
for x in values:
print(f"{x}:{values[x]}")func(x=1, y=2, z=3)[Out]: x: 1
【今日必看|这些鲜为人知的Python功能,你值得拥有!】 y: 2
z: 3
同样 , 可以随意调用变量 , 在这种情况下 , 使用** values 。 通过使用双引号将其定义为**kwargs 。
本文插图
列表理解
理解表达式是必不可少的 , 这绝对是Python最有用的功能之一 。 最常见的是列表理解 , 绝大多数人都看过以下内容:
vals = [1, 2, 3, 4, 5][i**2 fori in vals]
[Out]: [1, 4, 9, 16, 25]
但不仅可以用方括号 , 你还能用几乎完全相同的语法定义生成器表达式:
(i**2 for i in vals)
[Out]: <generator object<genexpr> at 0x7f0281730fc0>
当然 , 生成器中的每个元素仅在被调用时才输出 , 我们可以使用list()来做到这一点:
list((i**2 for i in vals))
[Out]: [1, 4, 9, 16, 25]
只需对语法进行一点小的更改 , 甚至可以使用字典理解来构建字典:
{i: i**2 for i in vals}[Out]:{1: 1,
2: 4,
3: 9,
4: 16,
5: 25}
以上都是非常有趣的功能 , 特别是divmod和casefold , 我最近才体验过 , 你也一定要去尝尝呀 。
本文插图
留言点赞关注
我们一起分享AI学习与发展的干货
如转载 , 请后台留言 , 遵守转载规范
推荐阅读
- |展现上海浦东开发开放30周年成就,《新时代的浦东》特种邮票今日发行
- 考点|2020山东省公务员招录笔试,35.9万人今日开考
- 互联网|发放高利贷,还要窃取用户信息?这些金融APP在秀“道德底线”
- 海之声天津狮子林大街|七日瘦身汤的做法 懒人必看瘦身法
- 遥享健身|健身和身高之间有关系吗?看看这些对比,你可能有自己的想法
- 小K说房|为什么装修时在客厅放大沙发有些落伍?看完这些分享太美了
- 金屋房产|买房前这些准备工作必做!这四个点一定要注意,不然很容易被坑
- 穆勒鞋|女人鞋子要精不要多,买这些“经典款”就够了,时髦不累人还百搭
- 广州人的“体检报告”\n每百名老广就有8个查出这些问题
- 海底捞回应“乌鸡卷中吃出塑料片”事件
