0%

Python笔记

本文主要使用Python3.7

dir()列出指定类或模块中全部内容
help()查看某个函数或方法的帮助文档

Prev

range生成序列

  • range(101)可以产生一个0到100的整数序列。
  • range(1, 100)可以产生一个1到99的整数序列。
  • range(1, 100, 2)可以产生一个1到99的奇数序列,其中的2是步长,即数值序列的增量。

函数

1
2
def f(x):
return x+2

编写模块

1
2
def f(x):
return x+2

module1.py

1
2
3
4
5
import module1 as m1;
# __name__是Python中一个隐含的变量它代表了模块的名字
# 只有被Python解释器直接执行的模块的名字才是__main__
if(__name__ == '__main__'):
m1.foo();

引用全局变量

1
2
3
def f():
global a
a = 300

Python语言概述和开发环境

特点

面向对象、解释型、弱类型的脚本语言
特色:清晰的语法和可扩展性
弱点:运行速度慢,源代码加密困难

Sublime3 Python3配置

1
2
3
{
"cmd": ["python3", "-u", "$file"]
}

变量和简单类型

单行注释 & 多行注释

1
2
3
4
5
6
7
8
9
10
# 233


'''
233
'''

"""
233
"""

变量

Python作为弱类型语言,有两个典型特征:无须声明即可赋值,数据类型可以动态改变
查看变量类型用type()
变量命名规则差不多,可以使用中文日文等,Python2中需要声明编码utf-8,感觉…最好还是字母数字下划线吧,不能包含空格的
不能包含关键字,所有的关键字可以通过以下方法获得

1
2
import keyword
keyword.kwlist

内置函数也不能包含当做识别符

print函数

1
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

类型

整型

支持None
十进制形式:普通数字
二进制形式:0b0B开头
八进制形式:0o0O开头
十六进制形式:0x0X开头,不区分a-f大小写

浮点型

科学计数法
不允许除以0

复数

cmath模块中,虚部用jJ表示

字符串

字符串必须用引号括起来,单引号双引号均可
资瓷转义字符
如果两个字符串紧挨着写在一起会自动拼接
数值和字符串拼接时,将数值转换成字符串的两个函数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
5
s[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():查找子串出现的位置,未找到返回-1
index():查找子串出现的位置,未找到引发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(): 对元素排序,可以传入keyreverse两个参数,key是比较大小的键,reverse默认为False从小到大排序如果是True则从大到小排序

使用字典

keyvalue的映射,需要通过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(): 获得指定keyvalue,如果不存在则返回第二个参数也就是设置的默认值

使用字典格式化字符串
多参数时适用

1
2
3
s='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
6
if expression :
statements...
elif expression :
statements...
else :
statements

不要忘记冒号!
还有以下会被认为是False

1
False, None, 0, "", (), [], {}

pass语句可以当占位使用

assert

assert expression如果为True继续执行,否则引发AssertionError错误

loop

while

1
2
3
4
[init_statements]
while test_expression :
body_statements
[iteration_statements]

for-in
用于遍历
循环变量受for-in控制,不应在循环体中进行赋值;用于可迭代对象,有next()方法

1
2
for var in set|str|dict|list :
statements

isinstance(var, type)可以判断是否为指定类型

循环可以使用else,是循环条件不满足时执行的,不管是否进入循环

for表达式
可以有多层,继续往后加for即可

1
[表达式 for 计数器 in 可迭代对象]

zip()可以将多个列表压缩成一个zip()对象,长度不等取短的

循环控制

break,continue,return

函数

函数

1
2
3
def function_name(var1, var2, ...) :
statements
return [var]

当函数体只有一行时,可以与函数头放在同一行

为函数添加文档
将一段注释内容放在声明后函数体前,就可以通过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


参考

Have fun.