本文主要使用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错误,而是返回Noneupdate(): 用一个字典更新另一个字典,可以添加和覆盖items(): 获得所有的key-value对keys(): 获得所有的keyvalues(): 获得所有的valuepop(): 获得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
不要忘记冒号!
还有以下会被认为是False1
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/