Python 基础(二)
🍦 Python面向对象,易于阅读维护,丰富的库可用于Web开发、爬虫、自动化运维、自动化测试和数据分析等,功能十分强大。
1 函数
- 函数
- 只有在被调用时才会运行,可以将参数传递给函数,函数返回数据作为结果。
- 通过
def
关键字定义函数,调用函数时,需要使用函数名称,后跟括号()
。
1 |
|
1-1 参数
- 参数
- 信息可以作为参数传递给函数,缩写为
args
,任意参数缩写为*args
。 - 参数在函数名之后的括号内指定,可添加任意数量的参数,用逗号分隔。
- 默认情况下须使用正确数量的参数调用函数,函数需几个参数就必须使用几个参数调用该函数。
- 若不知道传递给函数的参数数量,则在函数定义的参数名称前使用星号
*
,接收一个参数元组。 - 函数定义不能为空,若函数内部没有定义内容,使用
pass
关键字可以避免语句报错。
- 信息可以作为参数传递给函数,缩写为
1 |
|
1-2 关键字
- 关键字
- 使用
key = value
语法进行参数发送,这样就不用考虑参数的顺序了。 - 关键字参数通常缩写为
kwargs
,任意关键字参数则缩写为**kwargs
。 - 若不知道传递给函数的关键字参数数量,则在函数定义的参数名称前使用两个星号
**
,接收参数字典。
- 使用
1 |
|
1-3 函数调用
- 函数调用
- 调用不带参数的函数,可使用默认值参数,
return
语句可让函数返回值。 - 将任何数据类型的参数发送给函数,会在函数内部被视为相同的数据类型。
- 调用不带参数的函数,可使用默认值参数,
1 |
|
1-4 函数递归
- 函数递归
- 函数递归意味着自定义的函数可以调用自身,递归是一个常见的数学和编程概念。
- 编写时易陷入一个永无止境或使用过多内存的函数中,递归也是有效的编程方法。
1 |
|
1-5 匿名函数
- 匿名函数
- 匿名函数
lambda
(关键字),可接受任意数量的参数,但只能有一个表达式。 - 在另一函数中将一个函数用作匿名函数时,可以很好地展示
lambda
的作用。
- 匿名函数
1 |
|
2 对象
- 对象
- Python是一种面向对象的编程语言,Python中一切皆对象,都有其属性和方法。
- 使用
class
关键字创建一个类,一个类就如同一个对象构造器,用于创建对象。 - 所有类都有一个名为
__init()
的函数,__init__()
函数总是在类启动时执行。 class
定义不能为空,若class
没有定义内容,使用pass
关键字可以避免语句报错。
1 |
|
2-1 对象方法
- 对象方法
- 对象也可以包含方法,对象中的方法属于该对象的函数。
- 参数
self
是对当前类实例的引用,用于访问属于该类的变量。
1 |
|
2-2 self参数
- self参数
- 参数
self
是对当前类实例的引用,用于访问属于该类的变量。 - 不必命名为
self
,可随意调用,但必须是类中任何函数的第一个参数。
- 参数
1 |
|
3 继承
- 继承
- 让类与类之间产生父子关系,即获取另一个类的静态属性或方法。
- 父类也叫基类或超类,子类是从另一个类继承的类,也叫派生类。
- 任何类都可以是父类,语法与创建类相同,创建子类时需将父类作为参数发送。
__init__()
函数每次使用类创建新对象时都会自动调用该函数,将其添加到子类中。- 子类不再继承父类的
__init__()
函数,会覆盖父类__init__()
函数的继承。 - 为保持父类的
__init__()
函数继承,需添加对父类__init__()
函数的调用。
- 子类不再继承父类的
- 还可以使用
super()
函数,让子类继承父类的所有方法和属性。 - 若在子类中添加与父类中函数同名的方法,会覆盖父方法的继承。
1 |
|
4 迭代器
- 迭代器
- 一个实现迭代器协议的对象,由方法
__iter__()
和__next__()
组成。 - 列表、元组、字典和集合等都是可迭代对象,都有
iter()
属性,用于获取迭代器。 - for循环遍历可迭代对象,实际上for循环即创建一个迭代器并循环执行
next()
方法。
- 一个实现迭代器协议的对象,由方法
1 |
|
- 类和对象迭代器
- 要将类和对象创建为一个迭代器,必须使用
__iter__()
和__next__()
方法。__iter__()
方法进行初始化等操作,始终返回迭代器对象本身。__next__()
方法允许执行操作,并且必须返回序列中的下一项。- 如果有足够的
next()
语句或在for循环中使用,迭代将永远进行。
__next__()
中添加StopIteration终止条件,以在迭代完成指定次数时引发错误,防止迭代永远进行。
- 要将类和对象创建为一个迭代器,必须使用
1 |
|
5 变量范围
- 局部范围
- 在函数内部创建的变量属于该函数的局部范围,并且只能在该函数内部使用。
- 函数内部创建的局部变量,对函数内部的任何函数都可用(嵌套函数都可用)。
1 |
|
- 全局范围
- 在代码的主体中创建的变量是全局变量,属于全局范围,可以在任何范围内使用。
- 若函数内外都使用相同变量名,将视为两个单独的变量,分别作用于函数内外部。
1 |
|
- 全局关键字
- 使用
global
关键字,在函数内部创建全局变量。 - 若要更改函数内的全局变量,需使用关键字引用。
- 使用
1 |
|
6 模块使用
- 模块使用
- 模块可以看成一个代码库,包含了一组要包含在应用程序中的函数文件。
- 创建一个模块,只需要将所需的代码保存在文件扩展名为
.py
的文件中。 - 使用模块则通过
import
语句导入:import module_name.function_name
。 - 模块中可包含函数,也可包含所有类型的变量,例如:数组、字典、对象等。
6-1 创建模块
1 |
|
6-2 导入模块
1 |
|
6-3 内置模块
- 内置模块
- 导入模块时可以使用as关键字创建别名,
dir()
函数可以列出模块中的所有函数名称。 - 使用from关键字从模块中导入部分元素,导入时引用模块中的元素不要使用模块名称。
- 导入模块时可以使用as关键字创建别名,
1 |
|
(1) Math
- 内置函数
min()
和max()
可用于查找可迭代对象中的最小值和最大值。abs()
返回指定数字的绝对值,pow(x, y)
则返回x的y次幂。
- 使用时需要导入math模块,导入后就可以使用模块的方法和常量了。
math.sqrt()
:返回一个数字的平方根。math.ceil()
:将一个数字向上舍入取整。math.floor()
:将一个数字向下舍入取整。math.pi
:常数,返回PI,即圆周率3.14159265...
的值。
1 |
|
(2) Json
- 一种用于存储和交换数据的语法,是文本,使用JavaScript对象表示法编写。
- Python中有内置包json,用于处理json数据,使用前需要import导入json模块。
json.loads()
方法可以用来解析json字符串,结果将会返回一个Python字典。json.dumps()
方法可以将Python对象直接转换为json字符串。json.dumps()
方法具有参数,用indent参数定义缩进数。- 使用separators参数定义分隔符,默认值为
(", ", ": ")
。 - 即:使用逗号和空格分隔每个对象,使用冒号和空格分隔键和值。
- 该方法还可用于对结果中的键进行排序,使用sort_keys参数指定。
- Python对象与等效的json(JavaScript),转换如下。
- 对象(json)、dict(Object)、list(Array)、tuple(Array)、string(String)。
- int(Number)、float(Number)、True(true)、False(false)、None(null)。
1 |
|
(3) Datetime
- 导入该模块可以显示当前日期,包含年、月、日、时、分、秒和微秒。
- 创建日期使用模块的构造函数
datetime()
,需年、月、日这三个参数。- 该函数接受时间参数和时区参数(例如:时、分、秒、微秒、tzone)。
- 该函数的时间和时区参数都可选,且具默认值0,时区默认值为None。
strftime()
方法将日期对象格式化为可读字符串,接受参数,使用format指定返回字符串的格式。- 时间日期格式化符号,示例如下。
%a
·····················Wed(简化星期)%A
·····················Wednesday(完整星期)%b
·····················Dec(简化月份)%B
·····················December(完整月份)%c
·····················Mon Dec 29 17:17:00 2019%C
·····················20(世纪)%d
·····················31(日,0-31)%f
·····················548513(微秒)%G
·····················2019(年份,ISO 8601)%H
·····················20(时,00-23,24小时制)%I
·····················07(时,01-12,12小时制)%j
·····················365(年中的第n天,001-366)%m
·····················06(月份,01-12)%M
·····················15(分钟,00-59)%p
·····················A.M.或P.M.%S
·····················15(秒,00-59)%u
·····················1(星期,1-7,ISO 8601)%U
·····················52(一年中的星期数,00-53,星期天开始)%V
·····················01(一年中的星期数,01-53,ISO 8601)%w
·····················0(星期,0-6,星期天开始)%W
·····················52(一年中的星期数,00-53,星期一开始)%x
·····················01/01/19%X
·····················17:15:00%y
·····················19(年份,00-99)%Y
·····················2019(年份,0000-9999)%z
·····················+0100(UTC offset,标准时间偏移)%Z
·····················CST(当前时区的名称)%%
·····················%(本身)
1 |
|
(4) 正则表达式
- 形成搜索模式的字符序列,用于检查字符串是否包含指定的搜索模式。
- Python有一个re内置包,用于处理正则表达式,使用前需导入re模块。
findall()
:返回一个包含所有匹配项的列表。sub()
:将匹配项替换为选择的文本,可以通过count参数来控制替换次数。search()
:在字符串中搜索匹配项,若有,返回一个Match对象,若多个,返回匹配项的第一个。split()
:返回一个列表,其中字符串在每次匹配时都被拆分,可通过maxsplit参数控制出现次数。
- 元字符:代表在正则表达式中具有特殊意义的专用字符,用来规定其前导字符在目标对象中的出现模式。
[]
·····················一组字符,例如"[a-m]"
\
······················特殊序列,也可用于转义字符,例如"\d"
.
······················除换行符之外的任何字符,例如"he..o"
^
······················以“hello”开头,例如"^hello"
$
······················以“world”结尾,例如"world$"
*
······················零次或多次出现,例如"he.*o"
+
······················一次或多次出现,例如"he.+o"
?
······················零次或一次出现,例如"he.?o"
{}
·····················指定出现的次数,例如"he.{2}o"
\|
·····················或,例如"falls | stays"
()
·····················捕获和分组
- 集合类特殊字符
[arn]
··················返回指定字符“a、r或n”之一的任意匹配项[a-n]
··················返回任意小写字符的匹配项[0-9]
··················返回0到9之间任意数字的匹配项[^arn]
·················返回除“a、r和n”之外的任意字符匹配项[0123]
·················返回指定数字“0、1、2或3”之一的任意匹配项[a-zA-Z]
···············返回a到z、A到Z之间任意字母的匹配项[0-5][0-9]
·············返回从00到59之间任意两位数字的匹配项[+]
····················集合中“+*.|()${} ”都无特殊含义,返回匹配字符串中任意“+”字符
- 特殊序列类字符
\A
·····················如果指定字符位于字符串“The”的开头,则返回匹配项,例如"\AThe"
\b
·····················返回位于单词“ain”的开头或结尾的指定字符匹配项,例如r"\bain"
\B
·····················返回不位于单词“ain”的开头或结尾的指定字符匹配项,例如r"ain\B"
\d
·····················返回字符串包含0到9数字的匹配项,例如"\d"
\D
·····················返回字符串不包含数字0到9的匹配项,例如"\D"
\s
·····················用于匹配单个空格符,包括tab键和换行符,例如"\s"
\S
·····················用于匹配除单个空格符之外的所有字符,例如"\S"
\w
·····················用于匹配a到z的字符、0到9的数字和下划线(_)字符,例如"\w"
\W
·····················用于匹配所有与\w不匹配的字符,例如"\W"
\Z
·····················如果指定字符位于字符串“Spain”的末尾,则返回匹配项,例如"Spain\Z"
1 |
|
- 匹配对象
- 指包含有关搜索和结果信息的对象,若无匹配,将返回None。
- Match对象具有用于检索有关搜索的信息和结果的属性与方法。
span()
:返回一个包含匹配“开始和结束位置”的元组。string
:返回传递给函数的字符串。group()
:返回字符串中匹配的部分。
1 |
|
7 用户输入
- 用户输入
- Python3.6版本使用
input()
方法进行用户输入。 - Python2.7版本使用
raw_input()
进行用户输入。 - 涉及到
input()
函数时停止执行,并在用户给出输入后继续执行。
- Python3.6版本使用
1 |
|
8 异常处理
- 异常处理
try
允许测试代码块的错误,except
允许处理代码块的错误,else
代码块允许在没有错误时执行代码。finally
代码块不管try
和except
代码块的结果如何,都允许执行代码,可以用于关闭对象和清理资源。
1 |
|
- 引发异常
- 使用
raise
关键字可以选择在条件发生时抛出异常。 - 可定义要引发的错误类型,及抛出异常时要打印给用户查看到的文本内容。
- 使用
1 |
|
9 命名规范
- 命名规范
- Python的命名规范需要遵循PEP8标准,使用良好的编码风格会让代码更具备可读性。
- 命名尽量使用全拼写单词,部分常用缩写则使用约定俗成的缩写方式,如num、ID等。
1 |
|
- 下划线
- 一个前缀下划线表示私有,一个后缀下划线可避免关键字冲突。
- 以单下划线开头
- 以单下划线开头的是弱内部使用标识,引包时不会导入该对象。
- 通常用于指示一个私有的变量或函数,但是不会真正变为私有。
- 而是被视为非公开的,即不该被直接访问或调用的变量或函数。
- 以双下划线开头:指示一个特殊的变量或函数,会被解释器重命名,避免与子类中的同名变量或函数发生冲突。
- 以双下划线开头和结尾:通常用于指示一个特殊的变量,会被解释器重命名,避免与用户定义的变量发生冲突。
Python 基础(二)
https://stitch-top.github.io/2021/01/15/python/python02-python-ji-chu-er/