5个实用却被忽略的Python功能

介绍5个容易被忽略的Python功能。

微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩

图片

Python文档中有一些不起眼却很强大的功能,以下是在Python中一些很有用的操作。

1.函数属性

你可以以类似于为类和对象设置特征的方式为函数设置特征。

def func(x):
    intermediate_var = x**2 + x + 1

    if intermediate_var % 2:
        y = intermediate_var ** 3
    else:
        y = intermediate_var **3 + 1

    # 在这里设置属性
    func.optional_return = intermediate_var
    func.is_awesome = 'Yes, my function is awesome.'

    return y

y = func(3)
print('Final answer is', y)
# 访问函数属性
print('Show calculations -->', func.optional_return)
print('Is my function awesome? -->', func.is_awesome)

在第10行和第11行,分别设置了属性“optional return”“is awesome”。稍后,在第19行和第20行,我们对这些属性进行了外部调用。代码的输出将是:

Final answer is 219
Show calculations --> 13
Is my function awesome --> Yes, my function is awesome

当不想在每次运行函数时使用返回语句显式地返回一个变量,但仍然想恢复作为中间值传入的变量时,这很有用。此外,请注意,属性可以从函数声明内部或外部设置。

2.带else的for循环

Python中的for循环可以添加else子句。只有在执行循环体期间没有遇到break语句时,else子句才会被激活。

my_list = ['some', 'list', 'containing', 'five', 'elements']

min_len = 3

for element in my_list:
    if len(element) < min_len:
        print(f'Caught an element shorter than {min_len} letters')
        break
else:
    print(f'All elements at least {min_len} letters long')

请记住,else是插入在for的层次上而不是if上。在这个例子中,没有任何元素的长度小于3。因此,break语句永远不会被使用。因此,在for循环完成之后,else子句将被激活,打印出上面显示的输出。

有人可能会认为,可以通过记住是否在另一个变量中找到了break语句来实现此操作。此外,对于在这之后的读者来说,这可能会使代码更易于理解。获取相同结果的等效方法如下:

my_list = ['some', 'list', 'containing', 'five', 'elements']

min_len = 3

no_break = True
for element in my_list:
    if len(element) < min_len:
        print(f'Caught an element shorter than {min_len} letters')
        no_break = False
        break

if no_break:
    print(f'All elements at least {min_len} letters long')

3.‘int’类型的分隔符

10000000100000000这样的整数(它们真的是不同的数字吗?)在视觉上很难区分。在这种情况下,Python会将逗号在此上下文中解释为多个整数的元组,因此无法像英语中那样使用它们。

但是Python有一个非常实用的解决方案:我们可以使用下划线作为分隔符,使代码更具可读性。因此,1_000_000将被视为单个整数。

a = 3250
b = 67_543_423_778

print(type(a))
print(type(b))

OUTPUT:
<class 'int'>
<class 'int'>
True

4.eval()和exec()

Python可以动态地读取一个字符串,并将其视为一行代码。用于评估表达式和执行语句的eval()exec()函数用于执行此操作。

a = 3

b = eval('a + 2')
print('b =', b)

exec('c = a ** 2')
print('c is',c)

在第3行,eval()函数将输入字符串读取为Python表达式,对其进行评估,并将结果分配给变量‘b’。

第6行的exec()函数将输入字符串读取为Python语句并执行它。

你还可以将动态构造的字符串传递给这些函数。例如,你可以创建1000个名为x_0、x_1、……、x_999的变量,而不必在代码中手动编写这些变量声明。这可能看起来是一个完全没有意义的功能,但事实并非如此。

在一般编程的大背景下,不仅仅是Python,在运行时使用eval/exec这种方法非常强大,因为它允许你编写动态代码,使用运行时可用的信息来解决甚至在编译时无法表达的问题。[......]exec实际上是一个嵌入Python内部的Python解释器,所以如果你有一个特别难解决的问题,你可以解决它的方法之一就是编写一个程序来“编写一个程序来解决它”,然后使用exec来运行这第二个程序。

你可以在如下网址阅读Steven D’Aprano对eval和exec的分析:

https://mail.python.org/pipermail/tutor/2015-February/104238.html

5.省略号

Ellipse或“...”是Python内置的常量,类似于None、True或False等内置常量。它可以用于各种场合,包括但不限于:

5.1 未编写代码的占位符

pass一样,当代码未完全编写,但需要语法上的占位符时,省略号可以用作通配符。

def some_function():
    ...
    
def another_function():
    pass

5.2 “None”的替代品

如果你想表示一个空的输入或返回值,通常会选择None。然而,在某些情况下,None是期望的输入或函数返回值之一。在这种情况下,省略号充当占位符。

# 计算第n个奇数
def nth_odd(n):
    if isinstance(n, int):
        return 2 * n - 1
    else:
        return None
        
# 计算第n个奇数的原始n
def original_num(m=...):
    if m is ...:
        print('This function needs some input')
    elif m is None:
        print( 'Non integer input provided to nth_odd( ) function')
    elif isinstance(m, int):
        if m % 2:
            print(f'{m} is {int((m + 1)/2)3th odd number')
        else:
            print(f'{m} is not an odd number')
original_num()

a = nth_odd(n='some string')
original_num(a)

b = nth_odd(5)
original_num(b)

original_num(16)

nth_odd()函数计算第n个奇数,original_num()函数计算从第n个奇数推导出的原始数字n。

在这里不能使用None,因为它是original_num()函数的期望输入之一。它们被用作m参数的默认占位符。代码的输出如下所示:

This function needs some input
Non integer input provided to nth_odd() function
9 is 5th odd number
16 is not an odd number

5.3 NumPy中的数组切片

NumPy使用省略号来切片数组。下面的代码展示了两种等效的分割NumPy数组的方式。

import numpy as np

a = np.arange(16).reshape(2,2,2,2)

print(a[..., 0].flatten())
print(a[:, :, :, 0].flatten())

OUTPUT:
[ 0  2  4  6  8 10 12 14]
[ 0  2  4  6  8 10 12 14]

因此,“…”表示需要多少个“:”。

Ellipsis布尔值

与None(布尔值为False)不同,Ellipsis布尔值被认为是True。

推荐书单

IT BOOK 多得(点击查看5折活动书单)icon-default.png?t=N7T8https://u.jd.com/psx2y1M

《Python从入门到精通(第3版)》

《Python从入门到精通(第3版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Python进行程序开发应该掌握的各方面技术。全书共分27章,包括初识Python、Python语言基础、运算符与表达式、流程控制语句、列表和元组、字典和集合、字符串、Python中使用正则表达式、函数、面向对象程序设计、模块、文件及目录操作、操作数据库、使用进程和线程、网络编程、异常处理及程序调试、Pygame游戏编程、推箱子游戏、网络爬虫开发、火车票分析助手、数据可视化、京东电商销售数据分析与预测、Web编程、Flask框架、e起去旅行网站、Python自动化办公、AI图像识别工具等内容。书中所有知识都结合具体实例进行介绍,涉及的程序代码都给出了详细的注释,读者可轻松领会Python程序开发的精髓,快速提升开发技能。

《Python从入门到精通(第3版)》icon-default.png?t=N7T8https://item.jd.com/14055900.html

精彩回顾

《使用Python和Spacy进行命名实体识别》

《用6个步骤实现Python发送电子邮件》

《Python开发者必看,使用ReactPy和Python进行前端网页开发》

《从R到Python,借助ChatGPT完成代码转换》

《Python性能分析,使用cProfile可视化并解决性能瓶颈问题》

《事半功倍,掌握12个在VSCode中进行Python开发的小技巧》

微信搜索关注《Python学研大本营》,加入读者群

访问【IT今日热榜】,发现每日技术热点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值