Python 基础语法 Pythonic 部分的总结

pythonic风格_【Python进阶】Pythonic风格整理 【Python进阶】Pythonic风格整理所谓Pythonic,就是代码风格符合Python的特点,合理使用“语法糖”,使代码简洁优美,更具可读性,便于维护和修改。一、Python之禅Python 里有个小彩蛋:在 Python Shell 里输入 import this这段话被称作“Python 之禅”(The Zen of Python),它列举了一些 Python 所推崇的理念,比如:优美... 阅读详情

Python 基础语法 Pythonic 部分的总结

一些废话

最近写 Python 代码时发现自己的代码很长,一个小模块也弄出了 200+ 行,而且代码多了,Debug 速度也很慢,开始怀疑自己会不会写 Py,所以想复习一下 Python 语法,这里总结一下自己看到的 Pythonic 的部分的语法。

赋值

Python 赋值是引用赋值。所以在函数传参时,改变(不是简单的赋其他值)实参的值,函数外传递的变量也会跟着改变。

对象的属性和方法都可以直接访问

除了可以使用成员访问符直接访问对象的属性和方法,也可以通过 getattr 方法和 setattr 方法直接访问对象的属性,这种通过名字访问对象属性的方式也叫做 ”反射“

检查两个引用是否指向同一个对象 —— is 关键字

可变对象与不可变对象

Python 中的大部分对象都是可变对象,即对象中包含的元素和值是可以被修改的,如列表、字典和用户自定义的对象。其他一些对象,如字符串和元组,是不可变对象。

常见的标量类型

类型描述
NonePython 中 “null” 值(只存在一个实例)
str字符串类型,包含 Unicode (UTF-8 编码) 字符串
bytes原生 ASCII 字节(或者 Unicode 编码字节)
float双精度 64 位浮点数值(并没有独立的 double 类型)
boolTrue 或 False
int任意精度无符号整数
  • 字符串格式化方式: str.format() 方法

    原型:S.format(*args, **kwargs) -> str

    replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
    field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
    arg_name          ::=  [identifier | digit+]
    attribute_name    ::=  identifier
    element_index     ::=  digit+ | index_string
    index_string      ::=  <any source character except "]"> +
    conversion        ::=  "r" | "s" | "a"
    format_spec       ::=  <described in the next section>
    

range 函数

range 函数返回一个迭代器,该迭代器生成一个等差整数序列

三元表达式

value = true-expr if condition else false-expr

与以下代码效果一致:

if condition:
    value = true-expr
else:
    value = false-expr

list 列表

  • list 添加元素有 append 方法和 insert 方法,insert 方法计算代价更高。如果想要在序列的头部和尾部都插入元素,那可以考虑 collections.deque

  • insert 方法的反操作是 pop,元素可以通过 remove 方法移除,该方法会定位第一个符合要求的值并移除它

  • 使用 in 关键字可以检查一个值是否在列表中,但该过程是线性逐个扫描的,所以十分缓慢。而字典和集合中是基于哈希表的,所以二者该过程会很快

  • 二分搜索和已排序列表的维护

    内建的 bisect 模块实现了二分搜索和已排序列表的插值。bisect.bisect 会找到元素应当被插入的位置,并保持序列排序,而 bisect.insort 将元素插入到相应位置

  • 切片:列表的切片操作为 seq[start:stop],其中区间为 [start:stop) 的左闭右开区间

    seq[::s] 意思是每隔 s 个取一个数值

    seq[::-1] 向步进传值 -1 可以对列表或者元组进行翻转

  • enumerate 内建函数作用于一个可迭代对象时,返回 (i, value) 元组序列,可以实现在遍历一个序列的同时追踪当前元素的索引

    原型: enumerate(iterable[, start]) -> iterator for index, value of iterable

    例子:

    strings = ["foo", "card", "bar", "aaaaaa", "abababa"]
    for index, value in enumerate(strings):
        print("index: {0} value: {1}".format(index, value))
    
    # 输出
    # index: 0 value: foo
    # index: 1 value: card
    # index: 2 value: bar
    # index: 3 value: aaaaaa
    # index: 4 value: abababa
    

dict 字典

  • 从字典中删除关键字可以用 del 方法, pop 方法会在删除的同时返回被删除的值

  • keys 方法和 values 方法分别返回提供字典键、值的迭代器

  • update 可以将两个字典合并

  • 从序列中生成字典有两种方式:

    • 最容易想到也是比较低效的写法是

      mapping = {}
      for key, value in zip(key_list, value_list):
          mapping[key] = value
      
    • 一种高效的写法是

      mapping = dict(zip(range(5), reversed(range(5))))
      
    • 另一种高效的写法是字典生成式

  • 默认值

    • 字典的 get 方法和 pop 方法可以返回一个默认值:

      if key in some_dict:
          value = some_dict[key]
      else:
          value = default_value
      
      # 上面代码的一种高效实现如下
      
      value = some_dict.get(key, default_value)
      
    • 类似的,字典的赋值也有相应的方法

      words = list(some_value, ...)
      by_letter = {}
      
      for word in words:
          letter = word[0]
          if letter not in by_letter:
              by_letter[letter] = [word]
          else:
              by_letter[letter].append(word)
      
      # 上面代码的一种高效实现如下
      
      for word in words:
          letter = word[0]
          by_letter.setdefault(letter, []).append(word)
      
      # 利用内建的集合模块 defaultdict 也可实现相同的功能
      from collections import defaultdict
      by_letter = defaultdict(list)
      
      for word in words:
          by_letter[word[0]].append(word)
      

列表、字典、集合的推导式

  • 列表推导式允许过滤一个容器的元素,用一种简明的表达式转换传递给过滤器的元素,从而生成一个新的列表。

    # 列表生成式写法
    [expr for val in collection if condition]
    
    # 等价的 for 循环写法
    result = []
    for val in collection:
        if condition:
            result.append(expr)
    
  • 字典的推导式

        dict_comp = {key-expr : value-expr for value in collection if condition}
    
  • 集合推导式

        set_comp = {expr for value in collection if condition}
    
  • 嵌套列表推导式:可以用来做容器的扁平化

    flattened = [x for tup in some_tuples for some_tuples in some_lists if condition]
    

Map、Reduce、Filter

参考链接: Map, Filter and Reduce

  • Map: 对序列中的元素一次执行 function(item)

    原型: map(func, *iterables) --> map object

    例子:

    def f(x):
        return x ** 2
    
    data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    result = map(f, data)
    result
    # 输出: <map at 0x7fdb80523470>
    
    list(result)
    # 输出: [1, 4, 9, 16, 25, 36, 49, 64, 81]
    
  • Reduce: 对序列上的元素迭代计算,直到序列减少到一个值,返回最终的结果。

    原型: reduce(function, sequence[, initial])

    例子:

    from functools import reduce
    product = reduce((lambda x, y: x * y), [1, 2, 3, 4])
    
    product
    # 输出: 24
    
  • Filter: 将过滤条件作用在序列上,并返回序列中满足条件的元素的迭代器。

    原型:filter(function or None, iterable) --> filter object

    例子:

    filter_res = filter(lambda x: x<0, range(-5, 5))
    
    filter_res
    # 结果: <filter at 0x7fdb80562dd8>
    
    list(filter_res)
    # 结果: [-5, -4, -3, -2, -1]
    

函数

  • 函数的参数分为位置参数和关键字参数,关键字参数通常用于指定默认值或可选参数

    例:

    def func1(x, y, z=0.1):
        ...
    
    # 其中 x,y 为位置参数,z 为关键字参数
    
  • 函数内部如果要使用函数外的全局变量, 应该在函数内用 global 关键字声明该全局变量

  • 函数都是对象,充分利用这一特点可简化代码

    例子: 对于字符串的清理工作,需要清理字符串中一些脏的空格、符号等

    states = ["   Alalama", " Geob", "BaBaBa*", "West vir? "]
    
    import re
    def clean_string(strings):
        result = []
        for value in strings:
            value = value.strip()
            value = re.sub("[!#*?]", "", value)
            value = value.title()
            result.append(value)
        return result
    
    clean_string(states)
    # 结果: ['Alalama', 'Geob', 'Bababa', 'West Vir']
    

    如果将该过程看作是将特定的操作应用到某个字符串的集合上,可以得到更高层面的写法,如下:

    states = ["   Alalama", " Geob", "BaBaBa*", "West vir? "]
    
    def remove_punctuation(value):
        return re.sub("[!*#?]", "", value)
    
    clean_ops = [str.strip, remove_punctuation, str.title]
    
    def clean_strings_op(strings, ops):
        result = []
        for value in strings:
            for function in ops:
                value = function(value)
            result.append(value)
        return result
    
    clean_strings_op(states, clean_ops)
    # 结果: ['Alalama', 'Geob', 'Bababa', 'West Vir']
    

    当然,等效的基于 Map-Reduce 的写法如下:

    for x in map(str.title, map(str.strip, map(remove_punctuation, states))):
        print(x)
    
  • 返回多个值,函数需要返回多个值时,直接 return 要返回的多个对象即可

    def f():
        some defination expression...
    
        return a, b, c
    
  • 匿名函数,也称作 Lambda 函数,使用关键字 Lambda 定义

    例子: 对字符串按照字符串中不同的字母数排序

    strings = ["foo", "card", "bar", "aaaaaa", "abababa"]
    strings.sort(key=lambda x: len(set(list(x))))
    strings
    
    # 结果 : ['aaaaaa', 'foo', 'abababa', 'bar', 'card']
    

生成器

  • 迭代器是一种用于在上下文中(如 for 循环)向 Python 解释器生成对象的对象。
  • 普通的函数执行并一次返回单个结果,而生成器则“惰性”地返回一个多结果序列,在每一个元素产生之后暂停,直到下一个请求。
  • 如需创建一个生成器,只需在函数中将返回关键字 return 替换为 yeild 关键
    -生成器的表达式和列表、字典、集合的推导式很类似,创建一个生成器表达式,只需将列表推导式中的中括号替换为小括号即可
一个案例拆解Python核心编程心法,写出更Pythonic的代码 作为Python开发者,我发现自己常陷入这样的误区:明明学了新工具,却在实际编码时想不起用,直到遇到具体问题,才惊觉“原来这个场景正适合用XX函数”。今天借一个真实案例,聊聊如何用`enumerate()`写出更地道的Python代码,同时分享技术学习的实用心法。 阅读详情

相关推荐

Fanuc机器人的坐标变换矩阵的研究2

一、Funuc用户坐标系的介绍 二、用户坐标系与世界坐标系的坐标转换 三、 以用户坐标系1为基础旋转变换后的用户坐标系 四、关于点的WPR的含义 4.1:点在用户坐标系和世界坐标系下的坐标关系 4.2 通过转换矩阵返回去推导WPR

qq_34047402的博客 1525

Python语法和语言特性:理解Pythonic方式的最佳实践

Python,作为一门强大而灵活的编程语言,以其简洁、优雅的语法和独特的设计哲学而备受开发者喜爱。这门语言鼓励开发者采用一种被称为“Pythonic”的编码方式,即符合Python语言设计原则和惯例的编码方式。理解Pythonic的最佳实践不仅有助于提高代码的可读性和可维护性,还能更好地利用Python语言的强大特性。

Trb201013的博客 2267

一文详解AUTOSAR COM ComSignal结构体

ComSignalLength指定信号的长度,以字节为单位,影响数据的解析范围和精度。比如车速信号若为UINT16类型,ComSignalLength=16。这里需要注意必须ComSignalLength与ComSignalType匹配(比如FLOAT32类型需配置ComSignalLength=32),超出实际物理值范围时需配置缩放(Scaling)参数。ComSignalType定义信号的物理数据类型,决定如何解析原始字节数据。

menghuyouyou的博客 943

python是啥玩意-Pythonic到底是什么玩意儿?

作者:Martijn Faassen注:Martijn 是 Zope 领域的专家,他为 Zope 系列产品做了许多开发工作,也开发了 lxml 等多个开源产品。你可以在这里了解一下他的信息http://www.zope.org/Members/faassen。这篇文章写于 2005 年,虽然有少部分内容(主要是例子)看起来已经有些过时,但即便是在今天,它的中心思想依然有极高的指导意义。这是几个月前...

weixin_39849888的博客 296

Unity3D实战:用EasyAR4.0稀疏空间地图打造AR导航应用(附完整代码)

本文详细介绍了如何使用Unity3D和EasyAR4.0的SparseSpatialMap功能构建AR导航应用。通过稀疏空间地图技术,开发者可以创建室内导航系统,解决传统GPS在室内环境中的局限性。文章包含完整代码示例,涵盖环境配置、地图构建、导航实现及性能优化等关键步骤,助力开发者快速掌握AR导航开发技巧。

t8u9v0的博客 1197

时钟门控ICG单元的timing问题

本文探讨了数字IC设计中门控时钟(ICG)的时序收敛问题,重点分析了ICG单元在setup时序检查中易出现违例的原因及优化方法。文章指出,由于ICG单元不在时钟树平衡范围内,其时钟路径延迟通常小于后续寄存器,导致setup时序难以满足。提出的解决方案包括:1)将ICG尽量靠近受控寄存器放置;2)使用set_clock_gating_check命令加强时序约束;3)在布局阶段设置负时钟延迟;4)CTS阶段设置插入延迟。同时强调set_clock_gating_check命令对ICG单元同样有效,并介绍了ICG

u011075954的专栏 1112

什么是Pythonic?

震惊,这篇文章的阅读量竟然远远超过我写的其他很多好文章,可见现在Python的学习有多么火热了。 因为是早期写的文章,质量很一般,看到这么多访问着实惶恐,现在本人主要致力于前端学习,但是Python作为带我入门的语言,自然还是十分喜欢的,随着越学越多,对于语言风格其实有了更深的认识,推荐大家不要局限于一种语言的设计风格,如果真的爱,请博采众长,以集大成。 下面是原文,基本没有修改过,小白看个...

eswang的优快云博客 1万+

pgAdmin4备份恢复实战:从安装到避坑指南

本文提供了一份详尽的pgAdmin4备份恢复实战指南,涵盖从安装配置到执行备份恢复的全流程。针对Windows环境下的浏览器兼容性、二进制路径配置等常见问题,给出了具体解决方案。重点强调了使用pgAdmin4进行备份恢复的可靠性,特别是在处理包含PostGIS等扩展的数据库时,能有效避免数据类型和权限错误,确保数据迁移的完整性与安全性。

weixin_29266007的博客 439

几个更优雅、更高效 Pythonic 代码写法!

本文分享几个鲜为人知的 Pythonic 技巧。这些技巧非常有用,但并不广为人知。通过学习和使用这些技巧,可以帮你节省时间和精力,并使你的代码更加优雅和高效。

艽野尘梦的博客 516

当我们谈论Unidbg时我们在谈什么

文章目录一、前言二、使用Unidbg的工作量是什么三、补环境补的是什么3.1 运行环境缺失3.2 上下文缺失四、Unidbg 不是所有情况下最优的解决方案五、Unidbg在大多数情况下是好的方案六、Unidbg和风控无关七、尾声 一、前言 这是一篇漫谈Unidbg的文章,我对Unidbg的使用和理解都还很浅,日后会更新或修改看法,欢迎大佬指点,也期待同侪讨论。 二、使用Unidbg的工作量是什么 我们常规使用Frida + IDA的动静态分析中,工作可能是这样的 找线索→Frida Hook验证→验证成功继

lilac的博客 5788

5、卡尔ibration中Denavit - Hartenberg与Hayati约定的转换

本文详细介绍了机器人运动学中Denavit-Hartenberg(DH)参数与Hayati参数的定义、适用场景及其相互转换方法。重点分析了两种参数在描述关节坐标系变换时的差异,特别是在处理平行或接近平行关节轴时的稳定性问题,并给出了从DH到Hayati及反向转换的具体数学公式与流程图。通过参数转换,可在不改变运动学模型的前提下提升建模精度与计算鲁棒性,适用于机器人标定与运动学分析等应用场景。

h0i1j2k3l的博客 121

【Python进阶】第1篇:Pythonic编程风格与高级技巧

Pythonic编程风格与高级技巧

JuicyActiveGilbert的博客 713

数据分享|1961-2017年中国0.25°×0.25° 逐日地表水文数据集(VIC-CN05.1)

其中,全球径流中心(University of New Hampshire and Global Runoff Data Centre, UNH/GRDC)的复合产流场集成了观测的河道径流和水量平衡模式模拟的地表和地下径流,常被用来评估模拟的径流。在长白山、海北灌丛和千烟洲通量站,模拟与观测的逐月潜热通量的平均NSE为0.61。VIC-CN05.1受益于较准确的大气驱动场、先进的地表水文参数化方案以及更真实丰富的土壤信息,可作为中国水文气象研究的参照数据,用于陆面模式的评估和长期的趋势分析等。

J_Giser的博客 1834

Driver Store Explorer 快速指南:3步清理 Windows 驱动存储,找回 C 盘空间

你删过垃圾文件、卸载过软件,C 盘却照样告急?问题多半出在驱动存储:每次更新驱动,Windows 都会自动保留旧版本一份,而且从不主动清理。Driver Store Explorer(RAPR)是一款免费开源工具,核心功能是逐个列出 Windows 驱动存储里的驱动包,帮你清掉旧版本、要回磁盘空间。 ## 🧩 问题拆解:驱动存储为什么越积越大 先交代个名词:驱动存储是 Windows 集中存

gitblog_00768的博客 831

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Python 基础语法汇总

【代码】Python 基础语法汇总。

oscar999的专栏 6573

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Python核心语法实战指南:从基础到Pythonic编程

编程语言的核心语法是构建任何软件应用的基石,它定义了数据操作、逻辑控制与代码组织的基本规则。理解变量与对象的绑定关系、可变与不可变类型的差异,是避免常见Bug的关键。掌握条件判断、循环结构以及函数封装,能显著提升代码的模块化与复用性。在Python中,遵循‘Pythonic’哲学,运用列表推导式、生成器表达式、装饰器等特性,可以使代码更简洁高效。这些技术广泛应用于数据分析、Web开发、自动化脚本等场景,是提升开发效率与代码质量的核心。本文聚焦于Python中最高频、最易错的核心语法点,如可变对象陷阱、arg

weixin_34161064的博客 446

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【Python】基础语法

python基础语法

每篇博客都不是最终版,都会随着我的学习更新 2166

pythonic编程规范_编写高质量的python代码(1):理解pythonic概念

Pythonic的定义遵循Pythonic的代码,看起来就像是伪代码,所有的伪代码都可以轻易转换为可执行的Python代码。比如在Wikipedia的快速排序条目下有如下伪代码:function quicksort('array')if length('array') < 1return 'array'for each 'x' in 'array'if 'x' <= 'pivot' t...

weixin_39615984的博客 248

为什么Python代码需要遵守Pythonic风格?

写代码不那么pythonic风格的,多多少少都会让人有点难受。 什么是pythonic呢?简而言之,这是一种写代码时遵守的规范,主打简洁、清晰、可读性高,符合PEP 8(Python代码样式指南)约定的模式。

kyriez7的博客 1178

pythonic_pythonic方式

pythonicPython is an object-oriented, as well as the scripting programming language, It is an interpreted, powerful, and syntactically easy language.Python是一种面向对象的语言,也是一种脚本编程语言,它是一种解释性,功能强大且在语法上易于使用的语...

weixin_26729165的博客 339

pythonic_Python中那些 Pythonic的写法详解

前言Martin(Bob大叔)曾在《代码整洁之道》一书打趣地说:当你的代码在做 Code Review 时,审查者要是愤怒地吼道:“What the fuck is this shit?”“Dude, What the fuck!”等言辞激烈的词语时,那说明你写的代码是 Bad Code,如果审查者只是漫不经心的吐出几个“What the fuck?”,那说明你写的是 Good Code。衡量代码...

weixin_39898550的博客 268

替代for循环,让Python代码更pythonic !

在这个例子中,我们正在处理多层嵌套的代码,这很难阅读。我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

Trb601012的博客 961

《Effective Python》第1章 Pythonic 思维总结——编写优雅、高效的 Python 代码

对于 Python 而言,“Pythonic”已经成为描述遵循 Python 特定风格的代码的代名词。这种风格不仅让代码更易读、更简洁,还能充分利用 Python 的强大功能。本文将总结《Effective Python》一书中第一章“Pythonic Thinking”的核心内容,并结合实际示例探讨如何写出符合 Pythonic 风格的代码。

企业级后端与 AI 应用开发双线探索 968

Python基础语法全解析:从入门到实践

Python作为一门高级编程语言,以其简洁优雅的语法和强大的可读性著称。其核心设计理念是通过缩进规则实现代码块划分,这种独特的语法结构使得Python代码具有类似自然语言的流畅性。在编程基础层面,Python支持多种数据类型(如列表、字典、集合)和运算符(包括算术、比较和逻辑运算),并提供了完善的流程控制结构(条件语句和循环)。函数作为代码复用的基本单元,支持多种参数传递方式,而异常处理机制则保障了程序的健壮性。面向对象编程特性(如类与继承)进一步提升了代码的组织能力。理解这些基础概念是掌握Python开发

anmishi2025的博客 392

【Python进阶】详解循环与列表推导式:让你的代码更Pythonic!

【代码】【Python进阶】详解循环与列表推导式:让你的代码更Pythonic!

m0_73961257的博客 2167
上一篇: 设计模式学习笔记(一)
下一篇: Python 类 语法总结
Mleeeeeee
博客等级 码龄10年 65粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值