Python basic
帮助
dir(c)
查看 c 对象所具有的方法
1 | 'hello' c= |
help()
查看某个对象的某个方法的帮助信息
1 | help(c.split) |
运算符
Arithmetic operators
+
,-
, *
/
: Float
division, 结果为浮点数。 //
:Integer division,
舍去小数,结果为正数。 **
: 幂运算
Comparison operators
返回值: True
或 False
<
, >
, <=
,
>=
, !=
, ==
Logical operators
逻辑运算符(逻辑与,或,非): and
, or
,
not
Bitwise operators
位运算操作符(按位与,或,取反,异或, 左移,右移):
&
, |
, ~
, ^
,
<<
, >>
Assignment operators
每个算数运算符,位运算符与等号分别结合,进行运算赋值操作。 举例:
=
, +=
, &=
Special operators
Identity operators
Two variables that are equal does not imply that they are identical.
is
: True if the operands are identical (refer to the
same object, the same memory section) a is b
与
id(a) == id(b)
一个意思
is not
: True if the operands are not identical (do not
refer to the same object)
Membership operators
in
: True if value/variable is found in the sequence
not in
: True if value/variable is not found in the
sequence
作用:
检查一个值是否在一个序列(list,range,string etc.)中出现,如果包含,就返回 True,否则返回 False
通过 for 循环的序列进行迭代
name 属性
- 每一个后缀为 .py 的文件都被视为一个 Python 模块,可以被其他 Python 程序调用。
- 每一个 Python 脚本在运行时,都有一个
__name_
属性,通过它可以识别程序的使用方式,即:程序是在作为模块被导入,还是在独立运行。 - 如果程序是在作为模块被导入,那么
__name_
属性的值就自动设置为模块名,如果脚本是在独立运行,那么__name_
属性的值会被自动设置为字符串 “__name_
”
循环
在程序开发中,有三种流程方式:顺序、分支、循环。
for 循环
通过 range() 生成连续数列
1 | for i in range(1,5) |
range(start, stop, step)
Parameter | Description |
---|---|
start | Optional. An integer number specifying at which position to start. Default is 0 |
stop | Required. An integer number specifying at which position to end. |
step | Optional. An integer number specifying the incrementation. Default is 1 |
知识点:
- range 的 step 参数
- 切片超出范围不报错
range 逆序
range(5, -1, -1)
-- 正确,高效 It may be less intuitive but as the comments mention, this is more efficient and the right usage of range for reversed list.reversed(range(10))
-- 最直接 如果想要将其变为列表的话,进行一下强制类型转换即可list(reversed(range(10))
range(6)[::-1]
切片逆序
函数
def
是英文define
的缩写- 函数名称应该能表达函数封装代码的功能,方便后续调用
- 可以由字母、数字和下划线组成
- 不能以数字开头
- 不能与关键字重复
注意: 不能将函数调用放在函数定义的上方,否则控制台会提示
NameError: name "xxx" is not defined
因为在使用函数名调用函数之前,必须要保证 Python
已经知道函数的存在。
函数注释
在函数下方使用多行注释(三个引号) 来进行注释。
注意:根据 Python 官方代码格式要求(PEP8): 因为函数体相对比较独立,函数定义的上方,应该和其他代码 ( 包括注释 ) 保留两个空行。
技巧:PyCharm 中将鼠标放到函数定义的名字那里,然后出现提示,我们
insert documentation stirng stub
,
格式如下,然后当我们把光标放到使用函数的地方(函数名),然后按 Ctrl+Q
快捷查看函数信息。最后在 Pycharm 空白区域点击一下,便退出。
1 | def download(url, img_dir): |
函数返回值
- 对于逻辑运算,最终将布尔值返回的情况,不建议使用下面写法:
1 | def f(): |
使用下面的写法更好:
1 | def f(): |
比如:判断闰年的例子
提示:工作中针对需求的变化,应该冷静思考,不要轻易修改之前已经完成的能够正常执行的函数。
文件操作
步骤
- 通过 open() 函数打开文件,并创建一个 File 对象
- 调用 File 对象的 read() 或 write() 等方法,对文件内容进行读写操作
- 调用 File 对象的 close() 方法,关闭并保存文件内容
文件的打开模式主要包括:
r 只读模式(默认)
w 只写模式(如果文件存在,则先清空原有内容,文件不存在则创建文件)
a 追加模式(不覆盖文件中原有内容)
如果传递给 open() 的文件名不存在,写模式和追加模式都会创建一个新的空文件。
读取的方法
read() 将所有内容读到一个字符串中(包括换行符)。可以加参数,指定要读多少个字符
readline() 一行一行读取,包括
readlines()将所有内容,按照行,分到列表中
seek(arg) 定位指针
seek(0) 将文件流指针定位到文件首。
常用读取方法:
- for 循环与 readlines 迭代
1 | f=open('ip.txt','r') |
因为读取的文件每行末尾有 ,而 print 打印的时候,默认又会打印一个。所以最好的方法是让 print 不打印 。
或者通过字符串的 strip() 方法(默认去掉 whitespace,包括 ,空格)将文件中每一行末尾的 (Linux)或 (Windows)去除
1 | f=open('ip.txt','r') |
模块
模块是 Python 程序架构的一个核心概念。
概念
模块也叫库,每个模块中都内置了大量的功能函数、类和变量。它 就像是积木,可以根据需要进行调用组合。
模块就是程序,每个模块就是一个后级为 .py 的 Python 程序。
Python 的模块分为标准模块和第三方模块,标准模块是 Python 内置 的,第三方模块则需要安装之后才能使用。
模块中定义的
全局变量
、函数
都是模块能够提供给外界直接使用的工具可以通过 help 命令了解一个模块的基本帮助信息,如: help('sys')
模块名也是一个标识符,即: 如果你的 Py 文件想要可以当作模块被使用,其命名就要遵循标识符的命名规则。
Pyc 文件
c 是 compiled 的意思
当我们在导入自己写入的模块,并运行后,发现目录下生成了
__pycache__
的目录,其中包括我们导入的模块被解释后生成的二进制文件
.pyc
,用来加快速度(不用每次都解释,因为模块是相对固定,不修改经常修改的)
- 这个
pyc
文件是由 python 解释器将模块的源码转换为字节码
, python 这样保存字节码
是作为一种启动速度的优化。
字节码 python 在解释源程序时,分两步:
- 处理源码,解释生成字节码
- 对字节码进行处理,生成 CPU 能够识别的机器码。
- 有了模块的字节码之后,下次运行程序,如果在上次保存字节码之后,没有修改过源代码, Python 将会加载 .pyc 文件,并跳过编译这个步骤。
- 当 python 重编译时, 它会自动检查源文件和字节码文件的时间戳
- 如果你又修改了源代码,下次程序运行时,字节码将自动重新创建。
导入
无论是标准模块,还是第三方模块,都需要先导入之后,才可以使用
在程序中应只导入必须的模块,以减少运行压力
导入方法
- 直接导入模块
import module_name
- 从模块中导入某个函数:
from module_name import function_name
- 直接导入模块
两种导入全部方法的方式
- import os 应采用 “模块名.方法名” 的形式使用模块中的方法,如:os.system()
- import os from * 可以直接使用方法名, 如:system() 方法,无需加上模块名作为前缀。
常用模块
sys 模块
sys.argv()
sys.argv 是一个列表变量,专门用来向 Python 解释器传递参数,类似 Shell 脚本编程中的位置变量
脚本文件名 sys.argv[0]
用户输入的参数的数量 len(sys.argv) -1
所有参数 str(sys.argv)
第一个参数 sys.argv[1]
1 | 脚本文件名:d:/pyworkspace/banner.py |
sys.exit()
- sys.exit() 是一个方法,作用是推出当前程序
- sys.exit() 退出当前程序,并返回 SystemExit 异常
- sys.exit(0) 正常退出
- sys.exit('程序退出‘) , 退出时,显示一段提示信息
1 | if len(sys.argv) != 2: |
os 模块
os 模块提供了访问操作系统服务的功能
它最常用的是 os.system() 方法,可以在 Python 中使用操作系统命令。
1
2import os
os.system(cls)os.path.isfile() 方法,判断指定的对象是否为文件,返回 True 或 False
os.path.isdir() 方法,判断指定的对象是否为文件,返回 True 或 False
os.path.exists() 方法,判断指定的对象是否为文件,返回 True 或 False
1
2
3
4
5
6
7import os
'banner.py') os.path.isfile(
True
'banner.py') os.path.isdir(
False
'banner.py') os.path.exists(
True
多线程
通常通过多线程的方式来执行一个函数,从而使得该函数中的代码可以并发执行。
1 | t = threading.Thread(target=要执行的函数,args=(向函数传递的参数)) |
因为 args 是元组,所以如果元组中只有一个值的话,要在值后面加逗号,来指明它是元组。
一般只是用 Threading 中的 Thread 类,所以很多脚本都是使用下面语句导入的。
1 | from threading import Thread |
optparse 模块
- 利用该模块可以设置选项,
扩展
引入 stderr 是因为:
1.操作员希望在屏幕上看到程序的运行进度,但是不希望看到诊断信息。 2.当有人想重定向诊断信息时,悲剧发生了,正常输出也被重定向了,程序的运行开始变得不可预期。 3.虽然引入的系统级标准错误文件,但依然存在多个程序同时输出诊断信息的问题。
很自然的,一个进程独占,诊断信息分离的输出流 stderr 就出现 节选自何时使用 STDERR? - 知乎
参考资料
Python Operators > Print a list in reverse order with range()? > Python range 逆序迭代