python 诞生于1989年,(派森)python意思是大蟒蛇。 创始人是荷兰人吉多·范罗苏姆。
安装python解释器——https://www.python.org
直接下载installer后缀(可执行安装文件)
IDLE是python自带的一个简单的开发环境(只写简单代码或一行代码,长代码新建文件)
python3.8是交互式命令行程序
问好是官方技术文档
module docs是已安装的模块文档
第三方开发环境pycharm
https://www.runoob.com/w3cnote/pycharm-windows-install.html
数据类型,运算符等
二进制与字符编码
Unicode几乎包含了全世界的字符
UTF-8规定英文采用一个字节,中文用3个字节表示,而Unicode统统是2个字节
对象和类型
字符串(string),简记为str。使用‘ ’或“ ”括起来的一系列字符。
可以使用单引号,双引号,三引号来定义;单引号和双引号定义的字符必须在一行,三引号定义的字符串可以在来连续多行。
整数(integer),简记为int。
可以表示正数,负数和0;
十进制 默认的进制;
二进制 以0b开头;
八进制 以0o开头;
十六进制 以0x开头;
浮点数(float)
浮点数存储不精确性;
解决:导入模块decimal
from decamal import Decimal
print(Decimal(‘1.1’)+Decimal(‘2.2’))
布尔数(boolean),简记为bool
true的值为1,false的值为0;
复数(complex)
在将不同数据类型的数据拼接在一起时,需要进行类型转换
字符串转为int类型时,字符串必须是数字串,小数串也不行。
运算符与表达式
算术运算符
乘法:星号
除法:/ **
整除://
求余:%
指数:
一正一负整除(向下取整):
-9//4=-3;
9//-4=-3;9除以-4应该是-2.25,但是结果向下取整后变为-3
一正一负取余公式: 余数=被除数-除数*商
9%-4=9-(-4)(-3)=-3
-9%4=-9-4(-3)=3
自动类型转换
若参与运算的两个对象的类型相同,则结果类型不变 例子:1/2 =0,整数除以整数,结果仍为整数,即0
若参与运算的两个对象的类型不同,则按照规则进行类型转换:bool——int——float——complex 方向向右转换
例子:1.0 +3=4.0 (浮点数+整数=浮点数)
true +3.0=4.0 (布尔数+浮点数=浮点数)
关系运算符
运算的结果只有两种(布尔型)
注意:字符串之间也可以进行大小比较
is 比较两个变量的id是否相等,返回布尔值
is not 比较两个变量的id是否不相等,返回布尔值
逻辑运算符
in 是否在里面
例子:s=‘hello’
print(‘e’ in s) 结果为true,e在s中
not in 是否不在里面
位运算符
位与 & 对应数位都是1,结果数位才为1,否则为0
位或 | 对应数位都是0,结果数位才是0,否则为1
左移运算符<< 高位溢出舍弃,低位补0
右移运算符>> 低位溢出舍弃,高位补0
运算符优先级
变量与简单I/O
变量名=对象(数值、表达式等)
标识:对象所存储的内存地址,使用内置函数id来获取
类型:对象的数据类型,使用内置函数type来获取
值:对象所存储的具体数据,使用print可以打印输出
赋值运算符
**累加: += **
**累减: -= **
系列解包赋值 a,b,c=10,20,30
标识符
变量,函数,模块等的名字
命名规则:
包含数字和字母,下划线;
首个必须是字母或下划线;
大小写敏感;
标识符不能是关键字;
关键字(保留字)
注释
单行注释
以 # 开头,知道换行结束;
多行注释
- 用三引号进行注释;
- 中文编码声明注释 在文件开头加上中文声明注释,用于指定源码文件的编码格式。
键盘输入函数
input函数
读取键盘输入,将所有输入作为字符串看待。
语法:input([prompt])
[prompt]是提示符,提示键盘输入的内容是什么,最好提供。
例子:radius=float(raw_input(‘Raius:’))
输出
print关键字
功能:将对象的值输出到控制台上。
语法:print object(or variable)
如何将多个对象输出到一行?
print ‘the area for the circle of radius’,radius,‘is’,area (每个对象之间用逗号分隔开,对象包括字符串或者变量)
如何将一个字符串输出多行?
转义字符:当字符串中包含反斜杠,单引号或双引号等特殊用途字符时,必须用反斜杠进行转义
常用转义符:
\n 回车
\t 制表符(Tab),制表位占4位,每4个一组,若前面占了1位,则后面只有3位空格
\r return回车,但是会覆盖前面的字符
\b 退格,会覆盖前面一格
*\ 输入一个*
\ a 响铃(Bell)
\ 单引号 转义单引号
\双引号 转义双引号
原字符:不希望转义字符起作用
print(r’hello\nworld)
结果:hello\n world
注意:最后一个字符不能时反斜杠
程序控制结构
选择结构
if语句
if num%2==0 :
print('是偶数‘)
else:
print(‘奇数’)
**多分支结构:if—elif—else语句 **
if和else进行多分支结构,else:if可以简写为elif
多分支判断:if 90<=score<=100: (只有python存在)
条件表达式
print( (num_a ‘大于等于’ num_b) if num_a>=num_b else (num_a ‘小于’ num_b) )
条件表达式,如果是true,则打印前面的;如果是false,则打印后面的
pass语句:只是一个占位符,用到需要写语句的地方
if answer==‘y’:
pass
else:
pass
使用pass占位,程序不会报错
循环结构
内置函数range():生成一个整数序列
创建三种方法:
- range(stop) 创建一个**[0,stop)**之间的整数序列,步长为1
- range(start,stop) 创建一个**[start,stop)**之间的整数序列,步长为1
- range(start,stop,step) 创建一个**[start,stop)**之间的整数序列,步长为step
in与not in判断整数序列中是否存在(不存在)指定的整数
while 循环
for循环
已知循环的范围(range),即起始值和步长
break 结束当前循环体,即结束整个循环结构,通常与if一起使用
continue 结束当次循环,只结束这一次的循环,进入下一次的循环继续执行
for可以和else搭配使用
for item in range(3): 当三次循环结束后,跳出循环后执行else语句
else: print(‘对不起,三次密码均输入错误’)
while 和for一样可以与else搭配使用
函数与递归函数
函数
函数定义
例子:
def 函数名(start,stop):
函数体
[return xxx]
def是关键字
(start,stop)是参数,形式参数(形参,parameter)
调用函数
print_sum(1,10) 实际参数(实参,argument)
形参名称与实参名称可以不一致
在函数调用过程中,进行参数的传递
如果是不可变对象,在函数体的修改不会影响实参的值
**如果是可变对象,在函数体内的修改会影响实参的值 **
函数的返回值
- 函数返回多个值时,结果为元组
- 如果函数没有返回值,return 可以省略不写
- 函数的返回值,如果是1个,直接返回原值
- 函数的返回值,如果是多个,返回的结果为元组
函数的参数定义
- 函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参
- 无法事先确定传递的位置实参的个数时,使用可变的1个位置参数。使用 * 定义,结果为元组。
- 无法事先确定传递的关键字实参的个数时,使用可变的1个关键字形参。使用 ** 定义,结果为字典。
- 位置形参放在关键字形参后面。
变量作用域
- 局部变量:在函数内定义的变量,只在函数内部有效;局部变量使用global声明,这个变量就会成全局变量。
- 全局变量:函数体外定义的变量,可用于函数内外。
递归函数
**递归函数:**在一个函数体内调用了该函数本身
例子:计算6的阶乘
def fac(n):
if n==1:
return 1
else:
res= n*fac(n-1)
return res
print(fac(6))
字符串
不可变序列。
使用成对的单引号或双引号括起来。或者使用三引号(’’'或者" " ")
例子:’’’ this is
a test
today ‘’’
字符串驻留机制
相同的字符串只保留一份拷贝,后续创建相同字符串式,不会开辟新空间,而是使用旧的地址
符合条件:
- 字符串的长度为0或1时
- 符合标识符的字符串(字母,数字,下划线)
- 字符串只在编译时进行驻留 而非运行时
- [-5,256] 之间的整数数字
可以强制驻留: sys.intern( )
pycharm进行了优化处理,类似强制驻留
基本的字符串运算
长度(len()函数)
拼接(+)
重复(*)
name=‘hello’
s*3=‘hello hello hello’
成员运算符(in):判断一个字符串是否是另一个字符串的子串,返回值:true或者false
例子:name=‘hello’
‘e’ in name
返回true
for语句:枚举字符串的每个字符
字符串查询
字符串中每个字符都有一个索引值(下标),分为正向索引和逆向索引
例子:hello world
字符串常用操作
大小写转换
所有方法转换后都会产生一个新的字符串对象
内容对齐
字符串劈分操作
判断字符串
其他方法
字符串比较
任何一个字符都对应一个数字,即国际标准ASCⅡ码
比较规则
首先比较两个字符串的第一个字符;
如果相同,则比较下一个字符;
如果不同,则字符串的大小关系由这两个字符决定;
如果一个字符为空(较短),则更小;
比较原理
两个字符比较时,比较的是其ordinal value(原始值),调用内置函数ord可以得到原始值。相对应的有内置函数 chr ,调用时指定原始值可以得到其对应的字符。
比较方式:==和 is 的区别
== 比较的是value
is 比较的是id 是否相等
字符串切片操作
字符串是不可变类型:不能增、删、改等操作。切片会产生新的对象
格式化字符串
宽度精度控制
- (‘ %10d’ % 99) 表示10位宽度
- (‘% .3f’ % 3.14159) .3表示是小数点后三位
- (‘ %10.3f’ % 3.14159) 一共总宽度为10,小数点后三位
- (’{0: .3}‘ .format(3.14159)) .3表示是一共三位数
- (’{: .3f}‘ .format(3.14159)) .3f表示是三位小数
- (’{ : 10.3f}‘ .format(3.14159)) 同时设置宽度和精度,一共是10位,3位是小数
字符串编码转换
str在内存中以Unicode表示,在计算机之间传输需要以 byte 字节传输
编码:将字符串转换为二进制数据(bytes)
- encode(encoding=‘GBK’)) GBK编码格式中,一个中文站两个字节
- encode(encoding=‘UTF-8’)) UTF-8编码格式中,一个文中占三个字节
解码:将bytes类型的数据转换为字符串类型
- decode(encoding=‘GBK’)) 解码
列表与元组
列表
index是索引号
创建方法二:使用内置函数list()
lst=list([ ‘hello’,‘word’ ,98])
获取列表元素的索引
使用 index(‘hello’)查询列表中hello的索引。如果存在多个重复的,值返回第一个元素索引。
- 如果查询元素不在列表中,则出现valueError
- 可以在指定的start和stop之间进行查找
按索引获取列表元素
切片
语法:[ start:stop] start:开始位置的索引值。 finish:结束位置的下一个字符的索引值。
例子:
- 如果不提供start或者finish,默认start为第一个字符开始,stop为最后一个字符
- 如果步长step是正数,例如 [: stop:step] 则切片的第一个元素默认是列表第一个元素。
- 如果步长step是负数,例如 [ : stop:step] 则切片的第一个元素默认是列表的最后一个元素。
添加列表元素
- 向列表的末尾添加一个元素:append( )
- 向列表的末尾至少添加一个元素:extend( ) ,可以直接添加另外的列表
- 在列表的任意位置添加一个元素:insert(索引,新元素 )
- 在列表的任意位置添加至少一个元素:切片
删除列表元素
- remove( ) 从列表中移除一个元素,如果有重复元素只移除第一个
- pop( ) 删除一个指定索引位置上的元素;不指定索引则会删除最后一个元素。
- 切片 一次至少删除一个元素,但是会产生一个新的列表
若是想要用切片删除,且不产生新列表,可以将要删除的元素给空列表 [ ] - clear( ) 清空列表中所有元素,但列表对象还存在
- del( ) 删除列表对象
修改列表元素
- 直接给列指定索引的列表元素赋新的值
- 为指定的切片赋予一个新的值
例子:lst[1:3]=[300,400,500,600] 注意:这里[1:3]表示了4位
列表元素排序
- 调用sort()方法,列中所有元素默认从小到大排序,可以指定reverse=true,进行降序排序。
- 调用内置函数sorted(),可以指定reverse=true,进行降序排序,原列表不发生改变,产生一个新列表。
列表生成式
语法格式
[ i*i for i in range(1,10) ]
元素表达式 变量 整数序列
例子:lst=[i*2 for i in range(1,6)]
结果:[2,4,9,16,25]
元组
不可变序列,没有增,删,改操作
创建方法:
- 直接创建 t=( 1,’a‘,3.14,true ) 小括号可以省略
- 使用内置函数tuple() t=tuple ( (1,’a’,3.14,true) )
如果元组中只有一个元素,逗号不能省略,不然就是数据类型了,而不是元组类型
空元组创建
- t4 =( )
- t4=tuple( )
元组的遍历
- 使用索引, print( t[0] )
-for item in t
字典与集合
字典
scores={‘张三’ : 100}
字典名 键 冒号 值
使用内置函数dict()创建
dict ( name=‘jack’, age=20 )
字典在存储的时候,要经过哈希函数(hash)计算,得出存储位置
字典的实现原理与查字典类似,python中字典根据key查找value所在的位置
元素获取
- 使用中括号,例子:scores[ ‘张三’ ],若键不存在,则报错
- 使用get()方法,例子:scores.get(’ 张三’),若键不存在,返回None或者默认值
key的判断
- in 指定的key在字典中存在返回true
- not in 指定的key在字典中不存在返回true
字典元素删除
- 删除指定的key-value对 del scores [‘张三’ ]
- 清空字典元素 scores.clear()
字典元素的新增/修改
scores[ 'hello ']=100
获取字典视图方法
- 获取字典中所有key keys()
- 获取字典中所有value values()
- 获取字典中所有key,value对 items()
字典元素的遍历
for item in scores:
字典生成式
{ item.upper() : price for item , price in zip(items,prices)}
key表达式 value表达式 key变量 value 可迭代对象
内置函数zip(),用于将可迭代对象作为参数,将对象中对应的元素打包为元组,然后返回这些元组组成的列表
集合
使用花括号定义,但是只有key(键),没有value,也是hash函数,无序,但是可变
创建方式:
- 使用花括号 集合中的元素不允许重复,重复元素会被自动去掉
- 使用内置函数set()
print(set([3,2,4,5] )) 将列表类型转为元组类型
print(set((3,2,4,5))) 将元组类型转为集合类型
判断操作:in 或者not in
集合元素新增
- 调用add()方法,一次添加一个元素
- 调用update()方法,一次至少添加多个元素
集合元素删除
- 调用remove()方法,一次删除一个指定元素,如果指定元素不存在,则抛出keyError
- 调用discard()方法,一次删除一个指定元素,如果指定的元素不存在,不抛出异常
- 调用pop()方法,一次只删除一个任意元素
- 调用clear()方法,清空集合
**集合间的关系 **
- 两个集合相等 使用运算符==或 !=进行判断
- 集合是否是子集 调用 issubset方法进行判断
- 集合是否是超集 调用 issuperset方法进行判断
- 两个集合是否交集 调用 isdisjoint方法进行判断
集合的数学操作:原集合都不发生改变
- 交集。 使用intersection 方法 或者使用& 运算符
- 并集 。 使用 union 方法 或者使用 | 运算符
- 差集 。 使用 difference 方法 或者使用 - 运算符
- 对称差集。 使用symmetric_difference 方法 或者使用 ^ 运算符
集合生成式
{ i*i for i in range(10) }
将花括号改为中括号就是列表生成式