Python学习笔记
PYthon
PYTHON基础数据类型
整数
和我们生活中使用的整数一样1,2,3,4···100···
都是整数,PYthon可以处理任意大小的整数。由于计算机使用的是二进制,所以在计算机中也常用二进制或者十六进制表示整数。相比十进制,python使用0b表示,比如0b0110,0b1100等来表示
十六进制除了0~9个是个数字以外,还使用了a,b,c,d,e,f在python中,十六进制使用前缀0x,比如:0x12ef,0x2365a4fa
十进制数,二进制数,十六进制数是可以互相转换的。
浮点数
浮点数也可以理解为我们日常生活中所谓的小数,例如3.1415926,13.14,5.20等等,都是所谓的浮点数。浮点数之所以被称之为小数,是因为按照科学计数法来表达的时候,浮点数和小数点位置是可变的(浮动的),比如:31415.926*10^-4和3141.5926 *10^-3是一样的,因此称之为浮点数.
浮点数可以用数学发写入,例如3.14,5.2,13.14等。但是对于很大或者很小的浮点数,就必须用科学技术法表示,把10用e替代,比如3.14e-5=0.0000314.
浮点数和整数在计算机内部存储的方式是不同的,整数运算永远是精确的,而浮点数运算则可能会有四舍五入的误差。例如在python环境中输入0.1+0.2
然而输出的结果并不是0.3,但是0.01+0.02却可以精确的得到0.03
字符串
字符串对应生活中的就是非数字型的内容,例如,一段话或者一个句子,在python中就是字符串,在python中字符串的定义就是被””或者’’括起来的内容,比如’rxxy’,”ysfx”等等。’’,””本身知识一种表达方式,并不是字符串的一部分,因此’rxxy’中只有r,x,x,y这四个字符,并没有’,’
例如print (‘hello python’)其中的字符串只是hello python。
布尔值
布尔值对应于生活中的就是’对’和’错’在计算机的世界里,大部分判断都是非错则对的,布尔值和布尔代数的表示完全一致,一个布尔值只有TRUE,FALSE两种值,不是TRUE就是FALSE,在Python也可以直接用TURE或者FALSE表示布尔值,请注意大小写,不要使用字符串括号括起来,也可以通过布尔运算计算出来。
布尔值可以用and,or,和not运送(注意and,or,not都是用Python语言本身的关键字)
**and
**运算是与运算,只有所有都为 True,and运算结果才是 True。
**or
**运算是或运算,只要其中有一个为 True,or 运算结果就是 True。
**not
**运算是非运算,它是一个单目运算符,把 True 变成 False,False 变成 True。
空值
空值是Python里一个特殊的值,用None
表示。
注意,None和0是不一样的,None不能理解为0,因为0是有意义的,比如我有0个苹果表示我没有苹果,0表达的是数值0的意思,而不能表示为我有None个苹果,None是一个特殊的空值。
短路计算
- 在计算
a and b
时,如果 a 是 False,则根据与运算法则,整个结果必定为 False,因此返回 a;如果 a 是 True,则整个计算结果必定取决与 b,因此返回 b。a and b a假返回a,a真返回b
- 在计算
a or b
时,如果 a 是 True,则根据或运算法则,整个计算结果必定为 True,因此返回 a;如果 a 是 False,则整个计算结果必定取决于 b,因此返回 b。a or b a真返回b a假返回a
所以Python解释器在做布尔运算时,只要能提前确定计算结果,它就不会往后算了,直接返回结果。
短路运算的核心思想:
从左往右,只有当第一个操作数的值无法确定逻辑运算的结果时,才对第二个操作数进行求值
Python运算符的优先级
raw字符串与多行字符串
如果一个字符串包含很多需要转义的字符,对每一个字符都进行转义回很麻烦,为了避免这一种情况,我们可以在字符串前面加个点缀r
表示这是一个raw字符串,里面的字符就不需要转义了例如r'\(~_~)/ \(~_~)/'
但是r"..."
表示法不能表示多行字符串也不能表示包含'
"
的字符串如果要表示多行字符串可以用'''...'''
表示:
1 | '''Line 1 |
还可以在多行字符串面前添加r
把这个多行字符串变成一个raw字符串:
1 | r'''Python is created by "Guido". |
format字符串
字符串是Python程序重要的数据类型,到目前为止,我们输出的字符串的内容都是固定的,但有时候通过字符串输出的内容不是固定的,这个时候需要使用format来处理字符串,输出不固定的内容。
字符串format由两个部分组成,字符串模板和模板数据内容组成,通过大括号{}
,就可以把模板数据内容嵌到字符串模板对应的位置。
如果模板中{}
比较多,则容易错乱,那么在format的时候也可以指定模板数据内容的顺序。
1 | # 指定顺序 |
除了使用顺序,还可以指定对应的名字,使得在format过程更加清晰。
1 | # 指定{}的名字w,c,b,i |
python字符串切片
字符串由一个个字符组成,每一个字符都有一个唯一的位置。比如字符串'ABC'
,第一个字符是A
,第二个字符是B
,第三个字符是C
。
因此我们可以使用位置的方式取出字符串中特定位置的字符,按照位置取字符串的方式使用中括号[]
访问,这个时候可以把字符串看作是一个列表(一种新的数据类型,在后面会继续学习),不过需要注意的是,在程序的世界中,计数是从0
开始的,使用0
来表示第一个。
1 | s = 'ABC' |
有时候,我们会想获取字符串的一部分(子串),这个时候我们采取切片的方式获取,切片需要在中括号[]
中填入两个数字,中间用冒号分开,表示子串的开始位置和结束位置,并且这是半闭半开区间,不包括最后的位置。
1 | ab = s[0:2] # 取字符串s中的第一个字符到第三个字符,不包括第三个字符 |
我们定义一个更长的字符串,了解切片更多的细节。
1 | s = 'ABCDEFGHIJK' |
append()给一个list加入字符串 且一起只能加一个字符串,并且是从后往前加
insert()添加一个字符串到list列表 可以选择添加的位置,例如insert(2,'coddy')
那就是将原本在2位置的字符串向后推移,而coddy则插入进去
pop()则是删除list表中的字符串
替换list表中的字符串则是L[需要替换的字符串的位置数]=’替换完的字符串’
二维list
例如
1 | a = [1,2,3] |
那么L则是二维list表,而读取二维list表则是
print(L[0][2])
则是读取L列表中,第一个列表的第三个数
set
list列表可以转换为set
set里面的元素不可以重复
add()添加元素,update()可以一次添加多个元素,也可以理解为更新
例如
1 | # coding=utf-8names = ['Alice','Bob']names_set = set(names)names_set.add('Candy')print (names_set)new_names= ['Jenny', 'Ellena', 'Alice', 'Candy', 'David', 'Hally', 'Bob', 'Isen', 'Karl']names_set.update(new_names)print (names_set) |
注意:set添加已经存在的元素并不会报错,但是也不会发生改变,因为set只保留一个相同的元素
.remove()函数,如果set()里面没有这个元素,使用remove则会报错
.discard()函数,也是删除set()里面的元素,但是删除set()里面没有的元素并不会报错
clear()和dict中的clear()是一样的作用,为清空set(),注意clear是不能用在list里面的,同样tuple中也不能使用
set()中的判断是否重合或者超集和子集:
.issubset()参数是判断前者是否为括号中set()的子集
若为子集则得到true的值,若为否则得到false的值
.issuperset()参数是判断前者是否为括号中set的超集
若为超集则得到true的值,若为否则得到false的值
子集定义:前者的元素后者都有
超集定义:前者有后者的所有元素
若两者完全相等,则互为对方的子集和超集
而.isdisjoint()参数则是判断两者是否重合,或者两者是否拥有一样的元素,有则返回false,没有则返回true
1 | # Enter a codes1 = set([1, 2, 3, 4, 5])s2 = set([1, 2, 3, 4, 5, 6, 7, 8, 9])print (s1.issubset(s2))print (s2.issubset(s1))print (s1.issuperset(s2))print (s2.issuperset(s1))print (s1.isdisjoint(s2))print (s2.isdisjoint(s1))if s2.isdisjoint(s1) != 1: #判断是否有重合,y for a in s1: if a in s2: print a |
Python文件操作
文件读取方式:
- read([size]):读取文件(读取size个字节 ,默认全部读取)
- readline([size]):读取一行
- readlines([size]):读取完文件,返回每一行所组成的列表
- iter:使用迭代器读取文件
文件写入方式:
- write(str):将字符串写入文件
- writelines(sequence_of_strings):写多行到文件
写文件的过程
注释:当用Python编辑文件时,如果往文件内写入内容,输入的内容先进入程序的文件缓冲区,然后当关闭文件时,或者使用方法同步缓存,才会将文件缓冲区的内容写入磁盘.或者当写入的内容大于程序的写缓存,则直接写入磁盘
Python写磁盘的时机:
- 主动调用close()或者flush()方法,写缓存同步到磁盘;
- 写入数据量大于或者等于写缓存,写缓存同步到磁盘;
文件打开方式
mode | 说明 | 文件必须存在 |
---|---|---|
‘r’ | 只读方式打开 | 文件必须存在 |
‘w’ | 只写方式打开 | 文件不存在创建文件文件存在则清空文件内容 |
‘a’ | 追加方式打卡 | 文件不存在创建文件 |
‘a+’ | 追加和读写方式打开 | |
‘r+’/‘w+’ | 追加和读写方式打开 |
'rb','wb','ab','rb+','wb+','ab+'二进制方式打开
小知识:Python文件为什么要关闭
- 将写缓存同步到磁盘;
- 系统中每个进程打开文件的个数时有限的;(Linux线程打开文件数量限制 cat /proc/线程ID/limits )
- 如果打开文件数到了系统限制,再打开文件就会失败;
Python中requests模块详解
首先import requests
导入模块
然后就有基本的http请求方法
1 | requests.get('http://www.baidu.com/') #get请求requests.post('http://www.baidu.com/') #post请求requests.put('http://www.baidu.com/') #put请求requests.delete('http://www.baidu.com/')#delete请求requests.head('http://www.baidu.com/') #head请求requests.options('http://www.baidu.com')#options请求 |
发送请求的两种方式
1 | a = requests.get('http://www.baidu.com') #最基本的不带参数的GET请求b = requests.get(url='http://www.baidu.com',params={'rxxy':'python'}) |
给url传递参数
1 | asd_params = {'key':'value'} #字典传递参数,如果值位None的键不会被添加到url中r = requests.get(url='http://www.baidu.com',params = 'asd'='python') |
响应的内容
1 | r.encoding #获取当前的编码 |
Http代理
代理设置:http/https
参数设置:proxies/