0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简洁编写Python 语法的7种技巧分享

454398 来源:IT技术头条 作者:IT技术头条 2020-12-20 11:03 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Python 是一门用途广泛、易读、而且容易入门的编程语言。但同时 python 语法也允许我们做一些很奇怪的事情。

1、使用 lambda 表达式重写多行函数

众所周知 python 的 lambda 表达式不支持多行代码。但是可以模拟出多行代码的效果。

def f():

x = 'string'

if x.endswith('g'):

x = x[:-1]

r = ''

for i in xrange(len(x)):

if x[i] != 'i':

r += x[i]

return r

f()

-> 'strn'

虽然看起来很奇怪,但是上面的函数可以使用下面的 lambda 表达式函数代替:
(lambda: ([x for x in ['string']], x.endswith('g') and [x for x in [x[:-1]]], [r for r in ['']], [x[i] != 'i'and [r for r in [r+x[i]]] for i in xrange(len(x))], r)[-1])()

-> 'strn'

永远不要在生产环境写这样的代码 :)

2、三元运算符

现代的 python 提供了更简便的语法:
b if a else c

也可以通过下面的方式重写:
(a and [b] or [c])[0]
(b, c)[not a]

顺便说一下,下面的变体是错误的:
a and b or c

True and [] or [1] -> [1], but: [] if True else [1] -> []

3、通过列表推导式移除重复的元素

让我们来把字符串 x = 'tteesstt' 转换成 'test' 吧。

1.在原字符串中和上一个字符比较:
''.join(['' if i and j == x[i-1] else j for i,j in enumerate(x)]

2.把前一个字符保存到临时变量中:
''.join([('' if i == a else i, [a for a in [i]])[0] for a in [''] for i in x])

''.join([('' if i == a.pop() else i, a.append(i))[0] for a in [['']] for i in x])

3.在新字符串中和上一个字符比较:
[(not r.endswith(i) and [r for r in [r+i]], r)[-1] for r in [''] for i in x][-1]

4.通过 reduce 函数和 lambda 表达式:
reduce(lambda a, b: a if a.endswith(b) else a + b, x)

4、通过列表推导式获得斐波拉契数列

1.把中间值保存在列表中
[(lambda: (l[-1], l.append(l[-1] + l[-2]))[0])() for l in [[1, 1]] for x in xrange(19)]

[(l[-1], l.append(l[-1] + l[-2]))[0] for l in [[1, 1]] for x in xrange(19)]

2.把中间值保存到字典中:
[i for x in [(lambda: (l['a'], l.update({'a': l['a'] + l['b']}), l['b'], l.update({'b': l['a'] + l['b']}))[::2])()for l in [{'a': 1, 'b': 1}] for x in xrange(10)] for i in x]

[i for x in [(l['a'], l.update({'a': l['a'] + l['b']}), l['b'], l.update({'b': l['a'] + l['b']}))[::2] for l in [{'a':1, 'b': 1}] for x in xrange(10)] for i in x]

3.通过 reduce 函数和 lambda 表达式:
reduce(lambda a, b: a + [a[-1] + a[-2]], xrange(10), [1, 1])

reduce(lambda a, b: a.append(a[-1] + a[-2]) or a, xrange(10), [1, 1])

4.速度最快的变体:
[l.append(l[-1] + l[-2]) or l for l in [[1, 1]] for x in xrange(10)][0]

5、使用列表推导式产生死循环
[a.append(b) for a in [[None]] for b in a]

列表切片技巧

1.复制列表:
l = [1, 2, 3]

m = l[:]

m

-> [1, 2, 3]

2.移除/替换 列表中的任意元素:
l = [1, 2, 3]

l[1:-1] = [4, 5, 6, 7]

l

-> [1, 4, 5, 6, 7, 3]

3.在列表的开头添加元素:

l = [1, 2, 3]

l[:0] = [4, 5, 6]

l

-> [4, 5, 6, 1, 2, 3]

4.在列表的尾部添加元素:
l = [1, 2, 3]

l[-1:] = [l[-1], 4, 5, 6]

l

-> [1, 2, 3, 4, 5, 6]

5.反转列表:
l = [1, 2, 3]

l[:] = l[::-1]

6、替换方法字节码

Python 阻止替换类实例中的方法,因为 python 给类实例中的方法赋予了只读属性:
class A(object):

def x(self):

print "hello"

a = A()

def y(self):

print "world"

a.x.im_func = y

-> TypeError: readonly attribute

但是可以在字节码的层面上进行替换:
a.x.im_func.func_code = y.func_code

a.x()

-> 'world'

注意! 这不仅对当前的实例有影响,而且对整个类都有影响(准确的说是与这个类绑定的函数)(译者注:此处应该是笔误,推测作者原意是:准确的说是与这个函数绑定的所有类),并且所有其他的实例也会受到影响:
new_a = A()

new_a.x()

-> 'world'

7、让可变元素作为函数参数默认值

把可变对象作为函数参数的默认值是非常危险的一件事,并且在面试中有大量关于这方面棘手的面试问题。但这一点对于缓存机制非常有帮助。

1.阶乘函数:

def f(n, c={}):

if n in c:

return c[n]

if (n

r = 1

else:

r = n * f(n - 1)

c[n] = r

return r

f(10)

-> 3628800

f.func_defaults

({1: 1,

2: 2,

3: 6,

4: 24,

5: 120,

6: 720,

7: 5040,

8: 40320,

9: 362880,

10: 3628800},)

2.斐波拉契数列:
def fib(n, c={}):

if n in c:

return c[n]

if (n

r = 1

else:

r = fib(n - 2) + fib(n - 1)

c[n] = r

return r

fib(10)

-> 89

fib.func_defaults[0].values()

-> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

个人觉得,在所有的高级计算机语言中,Python 是最接近人类自然语言的。Python 的语法、风格都与英文的书写习惯非常接近,Python 的这种风格被称为 Pythonic,如条件表达式,在 JavaC++ 中是这样的:
int min = x

而 Python 是这样的:
min = x if x

显然,更加接近人的自然思维。

编辑:hfy


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    57

    文章

    4857

    浏览量

    89576
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    官方新品 | 虹科PCAN-Explorer 7发布:带来Python脚本与灵活授权新体验

    虹科PCAN-Explorer7支持Python脚本+授权管理升级在CAN总线技术持续进化的当下,我们始终相信,工具的革新应与技术的前沿同频,更应让复杂的研发与分析工作,回归简洁、高效的本质。虹科
    的头像 发表于 12-05 11:03 416次阅读
    官方新品 | 虹科PCAN-Explorer <b class='flag-5'>7</b>发布:带来<b class='flag-5'>Python</b>脚本与灵活授权新体验

    一文了解Mojo编程语言

    Mojo 是一由 Modular AI 公司开发的编程语言,旨在将 Python 的易用性与 C 语言的高性能相结合,特别适合人工智能(AI)、高性能计算(HPC)和系统级编程场景。以下是关于
    发表于 11-07 05:59

    语法纠错和testbench的自动生成

    编写Verilog代码时,我一般都是先在编辑器上写完,因为编辑器vscode或者notepad++可以提供语法高亮和自动补全等功能,然后用仿真器跑仿真,但是在编写过程中不可避免的会有一些语法
    发表于 10-27 07:07

    termux输出Hello termux

    Python 语法 Python 脚本文件中只需包含纯 Python 代码,无需添加 `python` 命令或 HTML 标签(如 ``
    发表于 08-29 12:16

    termux如何搭建python游戏

    Pygame),确保已安装`clang`编译器:`apt install -y clang` 3. 权限问题:若需访问手机文件,安装`termux-setup-storage`并授权存储访问权限。 通过以上步骤,即可在Termux中搭建完整的Python游戏开发环境,支持从代码
    发表于 08-29 07:06

    Python脚本实现运维工作自动化案例

    还在为重复性运维工作而烦恼?每天被各种告警、监控、部署搞得焦头烂额?作为一名有10年经验的运维老司机,今天分享5个超实用的Python自动化脚本,让你的运维工作效率提升300%!这些都是我在生产环境中实际使用的案例,代码简洁高效,拿来即用!
    的头像 发表于 08-27 14:46 798次阅读

    C++ 与 Python:树莓派上哪种语言更优?

    Python是树莓派上的首选编程语言,我们的大部分教程都使用它。然而,C++在物联网项目中同样广受欢迎且功能强大。那么,在树莓派项目中选择哪种语言更合适呢?Python因其简洁性、丰富的库和资源而被
    的头像 发表于 07-24 15:32 642次阅读
    C++ 与 <b class='flag-5'>Python</b>:树莓派上哪种语言更优?

    RAKsmart企业服务器上部署DeepSeek编写运行代码

    在RAKsmart企业服务器上部署并运行DeepSeek模型的代码示例和详细步骤。假设使用 Python + Transformers库 + FastAPI实现一个基础的AI服务。主机推荐小编为您整理发布RAKsmart企业服务器上部署DeepSeek编写运行代码。
    的头像 发表于 03-25 10:39 539次阅读

    零基础入门:如何在树莓派上编写和运行Python程序?

    是一非常有用的编程语言,其语法易于阅读,允许程序员使用比汇编、C或Java等语言更少的代码行。Python编程语言最初实际上是作为Linux的脚本语言而开发的。Py
    的头像 发表于 03-25 09:27 1523次阅读
    零基础入门:如何在树莓派上<b class='flag-5'>编写</b>和运行<b class='flag-5'>Python</b>程序?

    Python在嵌入式系统中的应用场景

    你想把你的职业生涯提升到一个新的水平?Python在嵌入式系统中正在成为一股不可缺少的新力量。尽管传统上嵌入式开发更多地依赖于C和C++语言,Python的优势在于其简洁语法、丰富的
    的头像 发表于 03-19 14:10 1189次阅读

    Python绘图Matplotlib快速参考手册

     PYTHON
    发表于 02-07 14:04 0次下载

    Python Connector for InterBase连接解决方案

    适用于 InterBase 的 Python 连接器 Python Connector for InterBase 是一可靠的连接解决方案,用于从 Python 应用程序访问 Int
    的头像 发表于 01-22 14:34 705次阅读

    使用Python实现xgboost教程

    使用Python实现XGBoost模型通常涉及以下几个步骤:数据准备、模型训练、模型评估和模型预测。以下是一个详细的教程,指导你如何在Python中使用XGBoost。 1. 安装XGBoost
    的头像 发表于 01-19 11:21 2213次阅读

    Flexus 云服务器 X:Python 安装的极致便捷之旅

    前言         Python 作为一高级编程语言,因其简洁易读的语法和强大的库支持,在数据科学、人工智能、Web 开发等领域得到了广泛应用。然而,不同平台上的安装过程可能会有所
    的头像 发表于 01-07 17:00 546次阅读
    Flexus 云服务器 X:<b class='flag-5'>Python</b> 安装的极致便捷之旅

    Triton编译器支持的编程语言

    编写和优化深度学习代码。Python是一广泛使用的高级编程语言,具有简洁易读、易于上手、库丰富等特点,非常适合用于深度学习应用的开发。 二、领域特定语言(DSL) Triton也提供
    的头像 发表于 12-24 17:33 1454次阅读