Python写代码的七条重要技巧介绍

目录
  • 前言
  • 0x00 规范命名
  • 0x01 面向对象
  • 0x02 使用 with
  • 0x03 使用 get
  • 0x04 提前返回
  • 0x05 生成器
  • 0x06 装饰器

前言

写出能完成功能的程序每个程序员都可以搞定,但能写出优雅的程序的程序员却寥寥无几,因此程序写的优雅与否则是区分顶级程序员与一般程序员的终极指标所在。

那身为一名 Pythoner,有哪些技巧能让我们写出优雅的 Python 代码呢,今天就给大家介绍七个能快速提升代码逼格的重要技巧。

0x00 规范命名

没有哪个程序员会抗拒一段命名规范的代码!

命名作为编程界的一大难题,实属难倒了很多人。不知道你是否还记得自己那些曾经很沙雕的命名呢。

a,b,c  x,y,z a1,a2 4_s,4s...
def do_something():
def fun():
...

相信你看到上面的命名也是一头雾水,好的命名不一定要写的多优雅,最起码要做到见名识意。

统一的命名风格可以让代码看起来更简洁,风格更统一,这样阅读者一看就知道这个变量或者函数是用来干嘛的,不至于猜半天浪费过多的精力在不必要的事情上。

0x01 面向对象

Python 是一门面向对象语言,因此我们有必要熟悉面向对象的一些设计原则。

单一职责原则是指一个函数只做一件事,不要将多个功能集中在同一个函数中,不要大而全,要小而精。这样,当有需求变化时,我们只需要修改对应的部分即可,程序应对变化的能力明显提升。

开放封闭原则是指对扩展开放,对修改关闭。

写程序的都知道,甲方是善变的,今天说用这种方式实现,明天可能就变卦了,这太正常了。

所以我们写程序时一定要注意程序的可扩展性,当甲方改动需求时,我们尽可能的少改动或者不改动原有代码,而是通过添加新的实现类来扩展功能,这意味着你系统的原有功能是不会遭到破坏的,则稳定性有极大提升。

接口隔离原则是指调用方不应该依赖其不需要的接口,接口间的依赖关系应当建立在最小功能接口原则之上。

单一职责和接口隔离都是为了提高类的内聚性,降低他们之间的耦合性。这是面向对象封装思想的完美体现。

0x02 使用 with

平时写代码难免会遇到操作文件的需求,一般都是用 open() 函数来打开一个文件,最后等操作完成之后通过 close() 函数来关闭文件,但有时候写多了难免会觉得很麻烦,难道不可以在我操作完自动关闭文件么,可以的。

使用 with 来操作文件无需考虑关闭问题,我们只需要关心核心的业务逻辑即可。

with open('tmp.txt', 'w') as f:
    f.write('xxx')
    ...

0x03 使用 get

当我们从字典中获取一个不存在的 key 时,如果是用中括号的方式来获取的话程序会返回 KeyError。这时候建议通过 get() 函数来获取。

同时通过 get() 函数来获取 value 时还可以设置默认值 default_value,当 key 不存在时则会返回 default_value。

0x04 提前返回

平时写的代码中少不了 if else 等控制语句,但有时候有的小伙伴喜欢将 if else 嵌套好多层,过几个月之后自己都看不明白当时写的啥。

比如下面这个程序,根据考试成绩来做评级。

score = 100
if score >= 60: # 及格
    if score >= 70: # 中等
        if score >= 80: # 良好
            if score >= 90: # 优秀
                if score >= 100: # 满分
                    print("满分")
                else:
                    print("优秀")
            else:
                print("良好")
        else:
            print("中等")
    else:
        print("及格")
else:
    print("不及格")
print("程序结束")

这种代码一看就想打人有木有,可读性极差。

代码的逻辑就是判断分数是否在一个区间,然后给出与之相匹配的评级,既然如此,则可以改写如下:

def get_score_level(score):
    if score >= 100: # 满分
        print("满分")
        return

    if score >= 90: # 优秀
        print("优秀")
        return

    if score >= 80: # 良好
        print("良好")
        return    

    if score >= 70: # 中等
        print("中等")
        return

    if score >= 60: # 及格
        print("及格")
        return

    print("不及格")
    print("程序结束")

这种处理方式是极其优雅的,从上往下清晰明了,大大增加了代码的可读性和可维护性。

0x05 生成器

我们都知道通过列表生成式可以直接创建一个新的列表,但受机器内存限制,列表的容量肯定是有限的。如果列表里面的数据是通过某种规律推导计算出来的,那是否可以在迭代过程中不断的推算出后面的元素呢,这样就不必一次性创建完

整个列表,按需使用即可,这时候生成器就派上用场了。

0x06 装饰器

试想一下如下的场景,当后端接收到用户请求后,需要对用户进行鉴权,总不能将鉴权的代码复制来复制去吧;还有我们的项目都是需要记录日志的,这两种情况最适合使用装饰器。事实上 Flask 框架中就大量使用装饰器来进行鉴权操作。

一切皆对象!

在 Python 中我们可以在函数中定义函数,也可以从函数中返回函数,还可以将函数作为参数传给另一个函数。

def hi(name="yasoob"):
    print("now you are inside the hi() function")

    def greet():
        return "now you are in the greet() function"

    def welcome():
        return "now you are in the welcome() function"

    print(greet())
    print(welcome())
    print("now you are back in the hi() function")

hi()
# output
# now you are inside the hi() function
# now you are in the greet() function
# now you are in the welcome() function
# now you are back in the hi() function

在上面的代码中,我们在 hi() 函数内部定义了两个新的函数,无论何时调用 hi()其内部的函数都将会被调用。

def hi(name="yasoob"):
    def greet():
        return "now you are in the greet() function"

    def welcome():
        return "now you are in the welcome() function"

    if name == "yasoob":
        return greet
    else:
        return welcome

a = hi()
print(a)
print(a())

# output
# <function hi.<locals>.greet at 0x7fe3e547a0e0>
# now you are in the greet() function

在这个例子中,由于默认参数 name = yasoob 因此 a = hi() 返回的是 greet函数。a 也就指向了 hi() 函数内部的 greet() 函数。

def hi():
    return "hi yasoob!"

def doSomethingBeforeHi(func):
    print("I am doing some boring work before executing hi()")
    print(func())

doSomethingBeforeHi(hi)

# output
# I am doing some boring work before executing hi()
# hi yasoob!

在最后这个例子中,我们将 hi() 函数传递给了另外一个函数,并且他们还很愉快的执行了。

现在,让我们来看看 Python 中的装饰器吧。

def a_new_decorator(a_func):

    def wrapTheFunction():
        print("I am doing some boring work before executing a_func()")

        a_func()

        print("I am doing some boring work after executing a_func()")

    return wrapTheFunction

def a_function_requiring_decoration():
    print("I am the function which needs some decoration to remove my foul smell")

a_new_function_requiring_decoration = a_new_decorator(a_function_requiring_decoration)

a_new_function_requiring_decoration()

# output
# I am doing some boring work before executing a_func()
# I am the function which needs some decoration to remove my foul smell
# I am doing some boring work after executing a_func()

看懂了没,就是上面我们介绍的基础操作的组合。事实上这就是 python 中的装饰器所做的事,通过这种方式来修改一个函数的行为。

但如果每次都这么写的话未免也太麻烦了吧,因此 python 为我们提供了一个便捷操作 @。

def a_new_decorator(a_func):
  ...

@a_new_decorator
def a_function_requiring_decoration():
    print("I am the function which needs some decoration to remove my foul smell")

a_function_requiring_decoration()

# output
# I am doing some boring work before executing a_func()
# I am the function which needs some decoration to remove my foul smell
# I am doing some boring work after executing a_func()

到此这篇关于Python写代码的七条重要技巧介绍的文章就介绍到这了,更多相关Python写代码技巧内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 3个 Python 编程技巧

    目录 1.如何按照字典的值的大小进行排序 2.优雅的一次性判断多个条件 3.如何优雅的合并两个字典 今天分享 3 个 Python 编程小技巧,来看看你是否用过? 1.如何按照字典的值的大小进行排序 我们知道,字典的本质是哈希表,本身是无法排序的,但 Python 3.6 之后,字典是可以按照插入的顺序进行遍历的,这就是有序字典,其中的原理,可以阅读为什么 Python3.6 之后字典是有序的. 知道了这一点,就好办了,先把字典的键值对列表排序,然后重新插入新的字典,这样新字典就可以按照值的大小

  • 分享介绍Python的9个实用技巧

    本文会介绍一些Python大神用的贼溜的技巧,让一探究竟吧!欢迎收藏学习,喜欢点赞支持,欢迎畅聊. 整理字符串输入 整理用户输入的问题在编程过程中很常见.有更好的方法来解决: user_input = "This string has some whitespaces... " character_map = { ord( ) : , ord( ) : , ord( ) : None } user_input.translate(character_map) # This string

  • Python性能调优的十个小技巧总结

    1 多多使用列表生成式 替换下面代码: cube_numbers = [] for n in range(0,10): if n % 2 == 1: cube_numbers.append(n**3) 为列表生成式写法: cube_numbers = [n**3 for n in range(1,10) if n%2 == 1] 2 内置函数 尽可能多使用下面这些内置函数: 3 尽可能使用生成器 单机处理较大数据量时,生成器往往很有用,因为它是分小片逐次读取,最大程度节省内存,如下网页爬取时使用

  • 最实用的20个python小技巧

    目录 1.用itertools排列 2.单行条件表达式 3. 反转字符串 4. 使用 Assert 处理异常  5. 对多个输入使用拆分 6. 用 zip() 转置矩阵 7. 资源上下文管理器 8. 下划线作为分隔符 9. 尝试 f 字符串格式 10.用这个技巧交换整数 11. 使用 lambda 代替函数 12.多次打印无循环  13. 将字符串解包为变量 14. 使用 Map 进行列表理解 15. 从列表中删除重复项 16. 打印语句中的条件  17. 条件列表 All 和 Any 18.

  • Python写代码的七条重要技巧介绍

    目录 前言 0x00 规范命名 0x01 面向对象 0x02 使用 with 0x03 使用 get 0x04 提前返回 0x05 生成器 0x06 装饰器 前言 写出能完成功能的程序每个程序员都可以搞定,但能写出优雅的程序的程序员却寥寥无几,因此程序写的优雅与否则是区分顶级程序员与一般程序员的终极指标所在. 那身为一名 Pythoner,有哪些技巧能让我们写出优雅的 Python 代码呢,今天就给大家介绍七个能快速提升代码逼格的重要技巧. 0x00 规范命名 没有哪个程序员会抗拒一段命名规范的

  • 写好Python代码的几条重要技巧

    程序设计的好与坏,早在我们青葱岁月时就接触过了,只是那是并不知道这竟如此重要.能够立即改善程序设计.写出"好"代码的知识有以下几点: •面向对象五个基本原则: •常见的三种架构: •绘图: •起一个好名字: •优化嵌套的 if else 代码: 当然,其他技术知识的丰富程度也决定了程序设计的好坏.例如通过引入消息队列解决双端性能差异问题.通过增加缓存层提高查询效率等.下面我们一起来看看,上面列出的知识点包含哪些内容,这些内容对代码和程序设计的改善有何帮助. 面向对象五个基本原则 本书作

  • Python的Bottle框架的一些使用技巧介绍

    之前对bottle做过不少的介绍,也写过一些文章来说明bottle的缺点,最近发现其实之前有些地方说的不太公平,所以趁此机会也来更正一下. bottle是支持类似flask url_for的语法的,具体使用方法在下文介绍     bottle的request.query之类的参数默认是str类型,也是有原因的,比如我在给google做代理的时候,编码就不一定是utf8的,如果强制转化utf8就会报错     之前的bug也得到了修正,比如mount('/x',app)之后,/x/和/x都可以访问

  • 用Python写漏洞验证脚本的代码

    小白尝试写任意文件读取poc 我是一个小白,完全不懂Python,但是Python在渗透中往往是一个重要的角色.有一个CSDN百万大佬写了这样一句话,不会编程的渗透都是耍流氓.我虽然菜但是也想尝试学习写一下Python漏洞的poc和exp. 我是在网上找到的学习方法,随便记录一下.尝试写一个批量验证漏洞的poc发现小米路由器有一个任意文件读取漏洞,学着写了看看 小米路由器远程任意文件读取漏洞小米路由器远程任意文件读取漏洞(CVE-2019-18371)小米路由器的Nginx的配置文件错误,导致目

  • 如何利用Python写个坦克大战

    前言 坦克大战是一款策略类的平面射击游戏,于 1985 年由 Namco 游戏公司发布,尽管时至今日已经有了很多衍生类的游戏,但这款游戏仍然受到了相当一部分人的欢迎,本文我们看一下如何使用 Python 来实现这款游戏,游戏实现主要用到的 Python 库为 pygame. 简介 坦克大战的组成主要包括:场景.坦克.子弹.食物.大本营,其本质就是一个塔防类的游戏,游戏目标为:守住大本营并且消灭敌方坦克,通常支持单双人模式,下面我们来看一下具体实现. 实现 首先,我们来实现游戏场景,场景的组成主要

  • 用python写爬虫简单吗

    所谓网络爬虫,通俗的讲,就是通过向我们需要的URL发出http请求,获取该URL对应的http报文主体内容,之后提取该报文主体中我们所需要的信息. 下面是一个简单的爬虫程序 http基本知识 当我们通过浏览器访问指定的URL时,需要遵守http协议.本节将介绍一些关于http的基础知识. http基本流程 我们打开一个网页的过程,就是一次http请求的过程.这个过程中,我们自己的主机充当着客户机的作用,而充当客户端的是浏览器.我们输入的URL对应着网络中某台服务器上面的资源,服务器接收到客户端发

  • 用Python写脚本自动评论再也不怕碰到喷子

    自从上次在B站看到一个喷子,一个人喷一堆人,当时我就看不过去了,直接用Python写了个自动评论软件,他说一句我能说十句,当场教育喷子~ 于是乎,顺便整理一下,做了一手教程,分享给大家,当然不是教大家去做喷子,只是学学这么个技术~ 不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以加这个群点我免费领取资料 包括今天的代码,过几天我还会做个视频教程出来,有需要也可以领取~ 给大家准备的学习资料包括但不限于: Python

  • 一分钟教你用Python写一幅春联

    目录 1. 前言 2. 代码中需要导入的模块 3. 下载字模 4. 下载龙凤呈祥背景底图 5. 生成春联 6. 测试样例 总结 1. 前言 春联是中国传统文化中最具内涵的元素之一,它以对仗工整.简洁精巧的文字描绘美好形象,抒发美好愿望,是中国特有的文学形式,是华人们过年的重要习俗.每逢春节期间,无论城市还是农村,家家户户都要精选一副大红春联贴于门上,辞旧迎新,以增加节日的喜庆气氛.据考证,这一习俗起于宋代,盛于明代.有据可查的最早的春联是“三阳始布,四序初开”,始见于莫高窟藏经洞出土的文物中,撰

  • python如何代码集体右移

    Python代码集体右移的方法: 直接选中需要右移的代码,按tab键即可. Python中代码集体左移的方法: 直接选中需要左移的代码,按shift+tab键即可. Python中的集体右移和左移给Python这种对格式要求严格的代码带来很多方便. 知识点补充: python代码整体左移或右移 选中代码块: 1)右移:直接 Tab 2)左移:Shift + Tab 到此这篇关于python如何代码集体右移的文章就介绍到这了,更多相关python集体右移方法内容请搜索我们以前的文章或继续浏览下面的

  • 最炫Python烟花代码全解析

    导语: 除夕除夕,就是除去烦脑,迎接新的希望!在这里小编先祝大家除夕快乐,岁岁常欢笑,事事皆如意! 正文: 创建画布 setup和draw是p5.js的两个主函数,里头的createCanvas用于创建画布的大小,background来设置画布的背景颜色 function setup() { createCanvas(1303 / 2, 734 / 2) } function draw() { background(50); } 画烟花粒子 考虑到会有很多,通过一个函数Particle来生成,代

随机推荐