Python3语法笔记(后篇)

前言

这篇文章主要用于记录Python3相关语法,方便自己查阅使用。

Python3语法笔记(前篇):
https://blog.csdn.net/Naisu_kun/article/details/130056943

这篇文章主要参考自官方文档中 教程(Tutorial) 部分:
英文文档:https://docs.python.org/3/
中文文档:https://docs.python.org/zh-cn/3/

函数

Python中使用 def 来定义函数,和大部分语言一样,函数可以有输入参数和返回内容:

def func1(): # 没有输入参数和返回的函数
    pass # 一些语句

def func2(arg1, arg2): # 有输入参数和返回的函数,多个输入参数之间使用 , 分隔
    pass # 一些语句
    return 233

输入参数

函数的输入参数可以有默认值( 默认参数 ),有默认值的参数必须放在后面:
在这里插入图片描述

调用函数时也可以使用输入参数名称来设置特定参数值( 关键字参数 ):
在这里插入图片描述

前面两个例子中可以看到函数使用时输入参数可以使用函数定义时的顺序输入,也可以使用关键字方式,Python中也可以使用符号来强制规定使用顺序或者关键字:

def func(arg1, /, arg2=22, *, arg3=33):
# / 前的参数使用时只能用顺序
# * 后的参数使用时只能用关键字

函数输入参数中最后可以使用可变参数,在调用时可以传入任意个数参数:
在这里插入图片描述

在调用函数时可以直接解包传入的列表、元组或字典等元素,分散成一个个独立的位置参数:
在这里插入图片描述
在这里插入图片描述

输入参数使用时需要注意值传递和引用传递的问题:

  • 值传递: 参数类型为不可变类型(字符串、数字、元组),函数内部修改传入的参数 不会 影响原始数据;
  • 引用(地址)传递: 参数类型为可变类型(列表,字典),函数内部修改传入的参数 影响原始数据;

在这里插入图片描述

另外默认参数使用可变类型时也需要特别注意:
在这里插入图片描述

传入参数也可以是函数,就是通常所说的回调函数,这个也非常常用,甚至算是必不可少的功能。

返回值

Python中每个函数中都有 return 语句,即使你没写也会有一个默认的 return None
在这里插入图片描述

return 通常只能返回一个对象,如果想要返回多个对象可以把需要返回的东西都封装到一个列表、元组等元素中。Python中也提供了进一步的简化:
在这里插入图片描述

return 也可以返回函数,常用的场景是函数内部定义函数,然后返回该函数。这个经常来拿做 闭包 使用:
在这里插入图片描述

装饰器(decorator)

装饰器是一个语法糖,可以在不改变原有函数的情况下增加函数功能:
在这里插入图片描述

装饰器也是可以带入参数的:
在这里插入图片描述

一个函数也可以使用多个装饰器:
在这里插入图片描述

需要注意的是一个函数如果用上了装饰器,那么会丢失原本的 __name____doc__ 等属性,这个可以使用语言内置的 @wraps() 装饰器来处理:
在这里插入图片描述

Lambda表达式(匿名函数)

使用 lambda 关键词可以临时性的定义一个函数:
在这里插入图片描述

文档和注解

定义函数时函数名的下面可以使用多行字符串方式编写函数文档:
在这里插入图片描述

Python是弱类型的,函数中输入输出内容也如此,不过可以使用 注解 来提示说明相关参数的类型:
在这里插入图片描述
需要注意的是 注解 只是提示性内容,解释器运行代码时并不会强制检查。

类和实例

类和对象是面向对象的语言中比较常用的功能。简单来说类就是对一个对象的抽象,其中包含了对象具有的一些属性(变量)和方法(函数)。下面是Python中类的最基本使用例子:
在这里插入图片描述

需要注意的是在类中如果不是像上面那样在构造函数中使用 self.xxx 方式声明的变量,而是直接和方法同级声明的普通变量,这将成为类变量,这在有些时候会产生意料之外的问题:
在这里插入图片描述

前面使用中实例的属性是可以在使用是获取和修改的,在实际使用时通常会有对实例属性的获取和修改进行特定处理的需求,比如下面的一些例子:
在这里插入图片描述
在这里插入图片描述

特殊方法

前面出现过 __init__(self[, ...]) 这个方法,其实这种 __xx__ 形式的方法是Python中的自带的特殊的方法,这些方法通常会在特定操作的时候被调用,比如 __init__ 就会在实例被创建的时候调用,下面是一些演示:
在这里插入图片描述

更多的这类方法可以查看 Python语言参考手册数据模型 章节的 特殊方法名称

继承

面向对象语言中涉及到类,往往还会有继承的概念,一个类(子类)可以继承自一个或多个类(父类)。子类可以直接拥有父类的属性和方法,子类也可以有自己的属性和方法,子类还可以重写(Override)父类的方法:

class P1:
    def __init__(self):
        print('P1构造方法')

    def fun1(self):
        print('P1 func1')


class P2:
    def __init__(self):
        print('P2构造方法')

    def fun2(self):
        print('P2 func2')


class Child(P1, P2):  # Child类继承 P1 P2 两个类
    def __init__(self):
        super().__init__()  # super()相当于第一个父类(P1)
        P2.__init__(self)  # 调用 P2 类的构造方法
        print('Child构造方法')

    def fun1(self):  # 重写P1类中的fun1方法
        super().fun1()  # 调用P1类中的fun1方法
        print('Child func1')


child = Child()
child.fun1()
child.fun2()

在这里插入图片描述

枚举类

Python中没有枚举类型,可以使用枚举类来代替:

from enum import Enum, unique

@unique  # 该装饰器用来检查内部不会有重复的值
class Color(Enum):
    red = 1
    green = 2
    blue = 3

print(Color.green) # 枚举类型直接通过 类名.属性 来访问
print(Color.green.name) # 访问属性名称
print(Color.green.value) # 访问属性值

# Color.green.value = 233 # 枚举类型的值无法修改

在这里插入图片描述

错误和异常

Python中的异常处理和大多数语言也很相似:

try:
    pass # 执行可能会出现异常的操作
except Exception: # 出现异常时分支,Exception为异常类型,可以使用元组包含多个异常类型,或者什么都不写来捕获所有异常
    pass
else: # 如果存在try和except,并且try正常执行后进入的分支
    pass
finally: # 不管是否出现异常,在这整个代码块结束前进入的分支
    pass

各种异常类型可以在 Python标准库内置异常 章节中查看。

Python中可以使用 raise 关键词来抛出异常。另外也可以使用 assert 关键词来测试表达式真假,如果为假则抛出 AssertionError 异常。

后记

这里只是粗略记录了一些Python的语法。Python作为脚本语言来说语法足够简单与灵活,可以算得上是比较不错的语言了(除了缩进和私有化)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值