Python系列(2)- Python 基本概念、内置模块、基础语法
1. 基本概念
模块 (Module):
在 Python 中,有三种方式创建模块:
(1) 创建一个 Python 文件;
(2) 用 C 语言实现,然后在运行时动态加载,比如常用的正则表达式模块 re;
(3) 内置模块,直接 import;
包 (package):
包就是多个模块的集合。当项目较大,模块较多时,就可以把模块放在包中,便于管理。
Python 的包有 Regular packages 和 Namespace packages。
Regular packages 指目录下有__init__.py文件,并且允许嵌套,即目录下可以嵌套一个同样是 package 的子目录。Namespace packages 也是有层次结构的模块组织,不过它不必须存在于文件夹,可以存在 Zip、网络上等,且子包与父包也不必存于同一个地方。
Python 提供的内置模块,可以直接使用 import 导入,比如 math、os、sys 等。
库(library):
严格来说,Python 中没有库 (library) 的概念,模块 (module) 和包 (package) 才是 Python 语法中有的概念。
这个库的概念是从其他编程语言引进来的,库的概念是具有相关功能模块和包的集合,只是一个通俗的说法。
Python 标准库是指在 Python 安装目录的 Lib 目录下的模块和包,它是安装 Python 程序时自带的。第三方库也是 Python 库,一般通过 pip 安装到 site-packages 目录 。
import 语句:
想使用 Python 源文件(模块),只需在另一个源文件(模块)里执行 import 语句,语法如下:
import module
当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入,搜索路径是一个解释器会先进行搜索的所有目录的列表。
一个模块只会被导入一次,不管执行了多少次 import。
from … import 语句:
使用 from package import item 这种形式的时候,对应的 item 既可以是包里面的子模块(子包),也可以是模块下的函数、类或者变量。
命名:
每个变量都拥有一个名字,这个就是命名,给变量命名。变量命名也是让很多程序员头疼的一件事情,怎么样能起一些有意义,又高大上的名字。在 Python 中,一切皆对象,我们甚至可以给一个函数一个命名,命名就可以理解为所有对象的一个引用的名称。
命名空间:
命名空间就是用来保证命名之间不发生冲突的规则,分为:
(1) 局部命名空间:在一个程序中为每个函数创建的命名空间,当函数执行完毕就失效;
(2) 全局命名空间:在程序中为所有模块创建的命名空间,当程序执行完毕失效;
(3) 内置命名空间:也就是默认的一些命名,退出程序失效;
迭代器 (Iterator):
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
Python 中使用迭代器的地方很多,大多数的容器对象都是可迭代对象,如列表、元组、字典、字符串等,均可以使用 for 语句进行迭代循环。
生成器 (Generator):
生成器 (Generator) 是 Python 中用来生成迭代器 Iterator 的一种特殊函数。
生成器是 Python 中实现迭代器的一种高效且优雅的方法,它利用 yield 关键字来简化迭代过程,并带来内存效率和代码可读性的双重提升。
装饰器 (decorator):
装饰器(decorators)是 Python 中的一种高级功能,它允许你动态地修改函数或类的行为。
装饰器是一种函数,它接受一个函数作为参数,并返回一个新的函数或修改原来的函数。
装饰器的语法使用 @decorator_name 来应用在函数或方法上。
2. 内置模块(包)
1) os 模块
os 模块提供操作系统相关联的函数。
示例,进入 Python 交互模式:
>>> import os
>>> os.getcwd() # 返回当前的工作目录
'C:\\'
>>> os.chdir('/temp') # 修改当前的工作目录
>>> os.system('mkdir today') # 执行系统命令 mkdir
0
建议使用 "import os" 风格而非 "from os import *"。这样可以保证随操作系统不同而有所变化的 os.open() 不会覆盖内置函数 open()。
2) sys 模块
sys 是 system 的缩写,可以用来获取操作系统和编译器的一些配置,设置及操作。
示例:
>>> import sys
>>> s = sys.stdin.read()
Hello world
^Z # Windows 下 Python 交互模式,^Z 表示同时按下 Ctrl + z 键,然后按回车键,Linux 下使用 Ctrl + d 键
>>> s
'Hello world'
3) time 模块
time 模块提供了处理时间的函数,例如获取当前时间、格式化日期和时间、计时等。
示例:
>>> import time
>>> t = time.ctime()
>>> t
'Wed Aug 28 17:12:19 2022'
4) datetime 模块
datetime 模块为日期和时间处理同时提供了简单和复杂的方法。
支持日期和时间算法的同时,实现的重点放在更有效的处理和格式化输出。
示例:
>>> from datetime import date >>> now = date.today() >>> now datetime.date(2022, 10, 24) >>> now.strftime("%Y-%m-%d is a %A on the %d day of %B.") '2022-10-24 is a Monday on the 24 day of October.' >>> d1 = date(1980, 1, 1) >>> age = now - d1 >>> age.days 15637
5) random 模块
random 模块提供了生成随机数的函数,例如生成随机整数、浮点数、序列等。
示例:
>>> import random
>>> a = random.randint(1, 10)
>>> a
7
6) math 模块
math 模块是内置模块,包含许多对浮点数的数学运算函数。math 模块下的函数,返回值均为浮点数,除非另有明确说明。如果需要计算复数,请使用 cmath 模块中的同名函数。
示例:
>>> import math >>> dir(math) ['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
7) re 模块
re 模块为高级字符串处理提供了正则表达式工具。对于复杂的匹配和处理,正则表达式提供了简洁、优化的解决方案:
>>> import re
>>> re.findall(r'\bg[a-z]*', 'good morning, go home, get up')
['good', 'go', 'get']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'have a nice nice day')
'have a nice day'
如果只需要简单的功能,应该首先考虑字符串方法,因为它们非常简单,易于阅读和调试:
>>> 'go up'.replace('go', 'get')
'get up'
8) json 模块
json 模块提供了对JSON数据的编码和解码功能。
示例:
>>> import json
>>> str = '{"name": "python", "age": 10}'
>>> obj = json.loads(str)
>>> obj['name']
'python'
9) zlib 模块
以下模块直接支持通用的数据打包和压缩格式:zlib,gzip,bz2,zipfile,以及 tarfile。
>>> import zlib >>> s = b'witch which has which witches wrist watch' >>> len(s) 41 >>> t = zlib.compress(s) >>> len(t) 37 >>> zlib.decompress(t) b'witch which has which witches wrist watch' >>> zlib.crc32(s) 226805979
10) timeit 模块
Python 提供了一个性能度量工具 timeit,可以度量不同方法之间的性能差异。
例如,使用元组封装和拆封来交换元素相比使用传统的方法,timeit 证明了元组方法更快一些。
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.0191244000000097
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.015919700000040393
相对于 timeit 的细粒度,:mod:profile 和 pstats 模块提供了针对更大代码块的时间度量工具。
11) 内置函数
Python3 内置函数:
abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod() id() object() sorted() ascii() enumerate() input() oct() staticmethod() bin() eval() int() open() str() bool() exec() isinstance() ord() sum() bytearray() filter() issubclass() pow() super() bytes() float() iter() print() tuple() callable() format() len() property() type() chr() frozenset() list() range() vars() classmethod() getattr() locals() repr() zip() compile() globals() map() reversed() __import__() complex() hasattr() max() round() reload() delattr() hash() memoryview() set()
示例:
>>> print("Hello world!") Hello world!
3. 基础语法
Python 是一种解释型的脚本编程语言,这样的编程语言一般支持两种代码运行方式:
(1) 交互式编程: 在命令行窗口中直接输入代码,按下回车键就可以运行代码,并立即看到输出结果;执行完一行代码,你还可以继续输入下一行代码,再次回车并查看结果……整个过程就好像我们在和计算机对话,所以称为交互式编程。
(2) 编写源文件: 创建一个源文件,将所有代码放在源文件中,让解释器逐行读取并执行源文件中的代码,直到文件末尾,也就是批量执行代码。这是最常见的编程方式,也是我们要重点学习的。
1) Hello World 程序
(1) 交互式
Python 交互式编程环境,第一种方法是在命令行工具或者终端(Terminal)窗口中输入 python 命令,看到 >>> 提示符就可以开始输入代码,这里以 Windows 终端为例,如下所示:
D:\>python Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> print("Hello world!") Hello world! >>>
第二种方法是打开 Python 自带的 IDLE 工具,具体操作与第一种方法类似。
(2) 编写源文件
内容如下:
#!/usr/bin/python3 # 注释1 # 注释2 ''' 注释3 注释4 ''' """ 注释5 注释6 """ print("Hello world!")
保存为 D:\hello.py, 打开 cmd 命令窗口,进入 D:\
D:\> python hello.py
Hello World
在 Sublime Text 里运行:
使用 Sublime Text 打开 D:\hello.py 文件,在菜单栏中依次找到 “Tools -> Build System”,然后选择“Python”。然后按 "Ctrl+B" 组合键或者选择 Tools 菜单中的 “Build” 选项,就可以运行 Python 程序。运行结果为:
Hello World!
[Finished in 1.0s]
2) 编码
默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码:
# -*- coding: cp-1252 -*-
上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码,对应适合语言为保加利亚语、白罗斯语、马其顿语、俄语、塞尔维亚语。
3) 标识符
在 Python 3 中,可以用中文作为变量名,非 ASCII 标识符也是允许的了。标识符的命名规则:
(1) 第一个字符必须是字母表中字母或下划线 _ ;
(2) 标识符的其他的部分由字母、数字和下划线组成;
(3) 标识符对大小写敏感;
4) python 保留字
保留字即关键字,不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字,进入交互模式输入如下代码:
>>> import keyword
>>> keyword.kwlist
5) 注释
Python 单行注释以 # 开头,多行注释可以用多个 # 号,还有 ''' 和 """。
6) 行与缩进
Python 使用缩进来表示代码块,不需要使用大括号 {} 。
缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。实例如下:
if True:
print ("True")
else:
print ("False")
以下代码最后一行语句缩进数的空格数不一致,会导致运行错误:
if True:
print ("Answer")
print ("True")
else:
print ("Answer")
print ("False") # 缩进不一致,会导致运行错误
执行后会出现类似以下错误:
File "test.py", line 6
print ("False") # 缩进不一致,会导致运行错误
IndentationError: unindent does not match any outer indentation level
7) 多行语句
Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠 \ 来实现多行语句,例如:
total = item_one + \
item_two + \
item_three
在 [], {}, 或 () 中的多行语句,不需要使用反斜杠 \,例如:
total = ['item_one', 'item_two', 'item_three',
'item_four', 'item_five']
8) 空行
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。
空行与代码缩进不同,空行并不是 Python 语法的一部分。书写时不插入空行,Python 解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。
注:空行也是程序代码的一部分。
9) 等待用户输入
执行下面的程序在按回车键后就会等待用户输入:
#!/usr/bin/python3
input("\n\n按下 enter 键后退出。")
以上代码中 ,\n\n 在结果输出前会输出两个新的空行。一旦用户按下 enter 键时,程序将退出。
10) 同一行多条语句
Python 可以在同一行中使用多条语句,语句之间使用分号 ; 分割,以下是一个简单的实例:
#!/usr/bin/python3
import sys; x = 'test'; sys.stdout.write(x + '\n')
11) 多个语句构成代码组
缩进相同的一组语句构成一个代码块,我们称之代码组。
if、while、def 和 class 这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。
将首行及后面的代码组称为一个子句 (clause)。
示例:
if condition :
语句
elif condition :
语句
else :
语句
12) print 输出
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=""。
#!/usr/bin/python3 x="a" y="b" # 换行输出 print( x ) print( y ) print('---------') # 不换行输出 print( x, end=" " ) print( y, end=" " ) print()