本文主要使用Python3.7
dir()
列出指定类或模块中全部内容help()
查看某个函数或方法的帮助文档
Prev
range生成序列
- range(101)可以产生一个0到100的整数序列。
- range(1, 100)可以产生一个1到99的整数序列。
- range(1, 100, 2)可以产生一个1到99的奇数序列,其中的2是步长,即数值序列的增量。
函数1
2def f(x):
return x+2
编写模块
1 | def f(x): |
module1.py
1 | import module1 as m1; |
引用全局变量1
2
3def f():
global a
a = 300
Python语言概述和开发环境
特点
面向对象、解释型、弱类型的脚本语言
特色:清晰的语法和可扩展性
弱点:运行速度慢,源代码加密困难
Sublime3 Python3配置
1 | { |
变量和简单类型
单行注释 & 多行注释
1 | # 233 |
变量
Python作为弱类型语言,有两个典型特征:无须声明即可赋值,数据类型可以动态改变
查看变量类型用type()
变量命名规则差不多,可以使用中文日文等,Python2中需要声明编码utf-8,感觉…最好还是字母数字下划线吧,不能包含空格的
不能包含关键字,所有的关键字可以通过以下方法获得1
2import keyword
keyword.kwlist
内置函数也不能包含当做识别符
print函数1
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
类型
整型
支持None
十进制形式:普通数字
二进制形式:0b
或0B
开头
八进制形式:0o
或0O
开头
十六进制形式:0x
或0X
开头,不区分a-f
大小写
浮点型
科学计数法
不允许除以0
复数
在cmath
模块中,虚部用j
或J
表示
字符串
字符串必须用引号括起来,单引号双引号均可
资瓷转义字符
如果两个字符串紧挨着写在一起会自动拼接
数值和字符串拼接时,将数值转换成字符串的两个函数str()
和repr()
略有不同
input()
获得输入的时候总是返回一个字符串raw_input()
是Python2.x提供的,相当于Python3.x的input()
长字符串其实就是多行注释的方法,三个引号,允许使用\
对换行符进行转义
原始字符串,也就是不进行转义的,r'G:\publish\code'
字节串(bytes):二进制保存数据
可以在字符串添加b
来构造包含ASCII字符的字节串
可以调用bytes()
函数来构造
可以用encode()
方法转换,用decode()
解码
深入使用字符串
转义字符就不说了..
字符串格式化
用%
做分隔符
Eg.print("%s is a %d years old boy", %(user, age))
其他格式代表跟c/c++差不多,有个r
是使用repr()
转化,s
是使用str()
转换-
指定左对齐,+
指定带符号,0
表示补充0
序列相关方法
整数表示正索引,负数表示负索引,也就是倒数1
2
3
4
5s[3: 5] # 不包含索引5,这是一个左闭右开区间,留空就是倒两端
s[3: -5]
s[-6: -3]
s[5: ]
s[: 5]
支持in
运算符查找子串
长度len()
获取
用max(),min()
获取最大和最小字符
大小写相关方法title()
:每个单词首字母大写lower()
:全部小写upper()
:全部大写
删除空白strip()
:删除字符串前后的空白lstrip()
:删除左边空白rstrip()
:删除右边空白
这些方法并不会真正修改字符串
查找、替换startswith()
:判断字符串是否以指定子串开头endswith()
:判断字符串你是否以指定子串结尾find()
:查找子串出现的位置,未找到返回-1index()
:查找子串出现的位置,未找到引发ValueError
错误replace()
:使用指定子串替换字符串的目标子串,第三个参数是替换次数,留空表示全部替换translate()
:使用指定的翻译映射表对字符串执行替换
Python提供了一个maketrans()
函数,有两个参数,前者是需要映射的所有字符,后者是映射后的所有字符
分割、连接split()
:将字符串按指定分割符分割成多个短语,两个参数,第一个是分隔符,第二个是分成的部分数量join()
:将多个短语连接成字符串,Eg.','.join(list)
运算符
/
表示普通除法,//
表示整除%
求余运算可以不是整数
两个都不能除0,否则引发ZeroDivisionError
错误
乘方运算**
,也可以执行开方运算
索引运算符[begin: end: step]
差不多这个样子
比较运算符与bool类型is
要求两个变量引用同一个对象id()
可以获得引用对象的地址
逻辑运算符and, or, not
三目运算符True_statements if expression else False_statements
先求expression
,如果是True
执行并返回True_statements
的值,反之执行并返回False_statements
允许使用多条语句,如果用逗号分割,每条都会执行,返回多条语句返回值组成的元组;如果用分号分割,每条购会执行,只返回第一条的返回值
支持嵌套
in
运算符判断是否位于序列,也有not in
符号优先级表我就不写了…打括号就vans了
列表、元组和字典
序列简介
字符串、列表、元组
列表是可变的,元组是不可变的1
2
3
4# 创建列表
[ele1, ele2, ...]
# 创建元组
(ele1, ele2, ...)
通过索引可以访问元素
slice语法,左闭右开1
[start: end: step]
加法
元组和列表不能相加,但是元组和元组、列表和列表可以相加
乘法
与整数相乘,将包含的元素重复$N$次
为了表示只有一个元素的元组,必须在唯一的元组元素之后添加英文逗号
in
运算符len(),max(),min()
,比较大小必须相同类型且可比较大小
序列封包和序列解包
程序把多个值赋给同一个变量时,会自动将多个值封装成元组,叫做序列封包
程序允许将序列直接赋值给多个变量,各元素会依次赋值给每个变量(个数必须相等),称为序列解包
如果在变量之前添加*
那么这个变量就代表一个列表
使用列表
list()
可以将元组或range
对象转换成列表
类似的,用tuple()
可以转换成元组
增加列表元素append()
将参数追加到列表最后,可以是元组或列表形成嵌套extend()
可以将参数依次追加到列表后面而不是当做一个整体insert(index, ele)
从中间插入
删除列表元素del
语句,Eg.del a[2]
不仅可以删除列表还可以删除变量
列表的方法,remove()
删除第一个找到的元素,clear()
清空
修改列表元素
直接赋值,也可以用slice语法对部分赋值,不要求数量相等,也就是可以增加元素
如果用slice语法用字符串对列表赋值,那么会把字符当成一个元素,如果slice语法指定了step,那么个数必须相等
其他常用方法dir(list)
可以查看所有方法count()
: 统计某元素出现次数index()
: 判断某元素出现位置pop()
: 当成栈来使用,出栈reverse()
: 将元素翻转sort()
: 对元素排序,可以传入key
和reverse
两个参数,key
是比较大小的键,reverse
默认为False
从小到大排序如果是True
则从大到小排序
使用字典
key
和value
的映射,需要通过key
访问value
,所以key
不允许重复
创建字典
列表不能作为key
,必须是不可变类型,元组可以
用dict
创建列表时,列表中的每个元组被当成一个key-value
,所以必须是两个元素
指定关键字参数创建字典,这是key
不允许使用表达式1
2
3{key1: value1, key2: value2, ...}
dict(list)
dict(chinese=1, jp=2)
添加只需赋值即可,删除用del
语句,in
判断是否有指定key
常见方法dir(dict)
clear()
: 清空所有key-value
对get()
: 通过key
获得value
,访问不存在的不会引发KeyError
错误,而是返回None
update()
: 用一个字典更新另一个字典,可以添加和覆盖items()
: 获得所有的key-value
对keys()
: 获得所有的key
values()
: 获得所有的value
pop()
: 获得key
所对应的value
并删除popitem()
: 删除最后一个储存的setdefault()
: 获得指定key
的value
,如果不存在则返回第二个参数也就是设置的默认值
使用字典格式化字符串
多参数时适用1
2
3s='name: %(name)s, age: %(age)d, weight: %(weight).2f'
d={'name': 'beiyu', 'age': 19, 'weight': 49.4}
print(s % d) # name: beiyu, age: 19, weight: 49.40
流程控制
if
严格缩进,缩进程度必须相同1
2
3
4
5
6if expression :
statements...
elif expression :
statements...
else :
statements
不要忘记冒号!
还有以下会被认为是False
1
False, None, 0, "", (), [], {}
pass
语句可以当占位使用
assert
assert expression
如果为True继续执行,否则引发AssertionError
错误
loop
while1
2
3
4[init_statements]
while test_expression :
body_statements
[iteration_statements]
for-in
用于遍历
循环变量受for-in
控制,不应在循环体中进行赋值;用于可迭代对象,有next()
方法1
2for var in set|str|dict|list :
statements
isinstance(var, type)
可以判断是否为指定类型
循环可以使用else
,是循环条件不满足时执行的,不管是否进入循环
for
表达式
可以有多层,继续往后加for
即可1
[表达式 for 计数器 in 可迭代对象]
zip()
可以将多个列表压缩成一个zip()
对象,长度不等取短的
循环控制
break,continue,return
函数
函数
1 | def function_name(var1, var2, ...) : |
当函数体只有一行时,可以与函数头放在同一行
为函数添加文档
将一段注释内容放在声明后函数体前,就可以通过help()
和函数的__doc__
获得文档
传参
按位置,按关键字,可以设置参数默认值,带默认值的参数定义在形参后面
参数收集 个数可变参数
前面加*
号,当做元组个数可变
前面加**
,当做字典,关键字参数收集的参数
逆向参数收集
将已有列表、元组、字典拆开传给函数参数
在传入列表元组的参数之前加*
,字典参数添加**
参数传递机制
跟其他语言一样,传的是形参,列表元组字典传的是实参,可以修改
变量作用域globals()
: 全局范围内所有变量组成的字典locals()
: 当前局部范围vars(object)
: 在指定对象范围内,若不传入object
则跟locals()
一样
在函数中声明全局变量,就是在变量名前加global
局部函数
在函数体内定义函数,对外部是隐藏的,称为局部函数,只能在封闭函数中使用
封闭函数可以返回局部函数供其他作用域中使用,如果封闭函数将局部函数返回,且程序使用变量保存了封闭函数的返回值,那么这些局部函数的作用域就会被扩大
可以使用nonlocal
生命访问赋值语句只是访问该函数所在函数内的局部变量
函数高级内容
函数变量,相当于起别名,也可以当做返回值、形参
局部函数与lambda表达式
lambda表达式只能是单行表达式
语法lambda [parameter_list]: 表达式
map()
函数
第一个参数是需要传入的函数,第二个参数是数据
到这里,基本的语法已经看完了,剩下就是类还有些比较高级的东西了,抽空看我错了,再补充下文件的部分…
算了…先看下基本的文件操作就可以了,详细的以后再说吧..
文件 I/O
打开文件
1 | open(file_name [, access_mode][, buffering]) |
file.closed
: 返回文件是否已经关闭file.mode
: 返回打开文件的访问模式file.name
: 返回打开文件的文件名称
打开模式r
: 只读w
: 写a
: 追加+
: 读写b
: 二进制模式
缓冲
如果open
第三个参数为0 or False
那么就不带缓冲,如果是1 or True
就带缓冲
读取文件
read()
如果读入是b
模式则读入字节,否则是字符,read()
的参数表示一次读取多少字节或字符
按行读取readline([n])
: 读取$n$行内容readlines()
: 读取所有行
csv库
https://docs.python.org/zh-cn/3/library/csv.html
参考
- 《疯狂Python讲义》,李刚.—北京:电子工业出版社,2019.1
- https://github.com/jackfrued/Python-100-Days/