一、python介绍
1.编程语言
机器语言
汇编语言
高级语言:
- 编译型:C、C++,执行速度快,跨平台差
- 解释型:Python、JavaScript、Perl、Shell,跨平台好,执行速度慢,依赖解释器运行
2.python发展史
1989年,Guido开始写Python语言的编译器
1991年,第一个Python编译器诞生
1994年,python1.0
2000年,python2.0
2008年10月,python2.6
2010年,python2.7
2008年12月,python3.0
3.种类
CPython
IPython
PyPy
Jython
IronPython
4.框架
- 异步高并发的主流框架Tornado
- 强大的插件扩展的flask
- 轻量级bottle框架
- 完美的django重型框架
5.字符编码
ASCII:占1个字节,只支持英文
GB2312:占2个字节,支持6700+汉字
GBK:GB2312的升级版,支持21000+汉字(中文2个字节,windows默认支持)
Unicode:2-4字节 已经收录136690个字符,并还在一直不断扩张中…(中文2个字节,英文2个字节,兼容GBK)(但是,文件的储存和传输不能使用unicode)
UTF-8:使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个(中文3个字节)
在看实际代码的例子前,我们来聊聊,python3 执行代码的过程
解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode
把代码字符串按照语法规则进行解释,
所有的变量字符都会以unicode编码声明
-
python3
1.文件默认编码是UTF-8
2.字符串编码是unicode
4.bytes与str不等同
5.所有unicode字符编码(encode)后都会变成bytes格式。除了unicode以外的编码字符在python3中显示成bytes格式 -
python2
1.文件默认编码是ASCII
2.字符串编码默认是ASCII
如果文件头声明了gbk,那字符串的编码就是gbk
3.在python里,unicode是一个单独的数据类型,用u‘路飞’表示
4.bytes与str等同(len一个str的数量是bytes的数量)
4.1在UTF-8编码下,
len(‘路飞’)得出来的数为6,
len(u’路飞’)得出来的数为2。
所以在python2里,unicode类型才是真正的“字符串”,而str类型应该是“字节串”。
在python3里,这个问题就得到了解决,str类型变成真正的“字符串”了
解码
解码是将字节序列转化为Unicode字符串的过程。我们从外界文本源(文件、数据库、网站、网站API等)获得的所有文本都是经过编码的字节串。重要的是需要知道它是以何种方式编码的,这样才能逆转编码过程以获得Unicode字符串。
编码
编码是将字符串(str)转化为一些列字节(bytes)的过程。
二、变量
在python里,内存自动回收;删除变量内存方式用del
1.定义规范:
变量名只能是字母、数字或下划线的任意组合
变量名的第一个字符不能是数字
一些关键字不能声明为变量:class、global、import等等python语法里的内部指令
2.命名习惯
驼峰体
AgeOfOldboy=56
下划线(优先使用)
age_of_oldboy=56
命名大忌
变量名为中文、拼音
变量名过长
变量名词不达意
3.常量
全部大写如PAI
三、数据类型
Python3 的六个标准数据类型中:
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
1.数字
Python3 支持 int(整型)、float(浮点型,不包含无限不循环小数)、bool、complex(复数)。
在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
2.字符串 str
不可变,更改时其实是新建一个内存地址
s1='hello world'
s1.capitalize(), Hello world
s1.center(20,'*'), ****hello world*****
s1.count('o'), 2
s1.find('world'), 6
s1.index('world'), 6
s1.isdigit(), False
s1.isalpha(), False
s1.join('$$$$'), $hello world$hello world$hello world$
s1.lower(), hello world
s1.upper(), HELLO WORLD
s1.ljust(5,'$'), hello world
s1.replace(s1,'i am the world'), i am the world
s1.split(), ['hello', 'world']
s1.strip(), hello world
s1.title(), Hello World
2.1 capitalize()
将字符串的第一个字母变成大写,其他字母变小写。
需要注意的是:
1、首字符会转换成大写,其余字符会转换成小写。
2、首字符如果是非字母,首字母不会转换成大写,会转换成小写。
2.2 center(width[ fillchar])
返回一个指定的宽度 width 居中的字符串,fillchar 为填充的字符,默认为空格。
width – 字符串的总宽度。如果 width 小于字符串宽度直接返回字符串,不会截断
fillchar – 填充字符。只能是单个字符
2.3 count(sub, start= 0,end=len(string))
用于统计字符串里某个字符出现的次数。可选参数为在字符串搜索的开始与结束位置。
sub – 搜索的子字符串
start – 字符串开始搜索的位置。默认为第一个字符,第一个字符索引值为0。
end – 字符串中结束搜索的位置。字符中第一个字符的索引为 0。默认为字符串的最后一个位置。
2.4 find(str, beg=0, end=len(string))
用于检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果指定范围内如果包含指定索引值,返回的是索引值在字符串中的起始位置。如果不包含索引值,返回-1。
str – 指定检索的字符串
beg – 开始索引,默认为0。
end – 结束索引,默认为字符串的长度。
2.5 index(str, beg=0, end=len(string))(str里尽量用find而不用index)
用于检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,该方法与find()方法一样,只不过如果str不在 string中会报一个异常。
str – 指定检索的字符串
beg – 开始索引,默认为0。
end – 结束索引,默认为字符串的长度。
2.6 isdigit()
用于检测字符串是否只由数字组成。
2.7 isalpha()
用于检测字符串是否只由字母组成。
2.8 join(sequence)
用于将序列中的元素以指定的字符连接生成一个新的字符串。
sequence – 要连接的元素序列。
2.9 lower() upper()
lower() 方法转换字符串中所有大写字符为小写。
upper() 方法转换字符串中的所有小写字符为大写。
2.10 ljust(width[, fillchar])
返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。
width – 指定字符串长度。
fillchar – 填充字符,默认为空格。
2.11 replace(old, new[, max])
把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
old – 将被替换的子字符串。
new – 新字符串,用于替换old子字符串。
max – 可选字符串, 替换不超过 max 次
2.12 split(str="", num=string.count(str))
通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则仅分隔 num+1 个子字符串
str – 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num – 分割次数。默认为 -1, 即分隔所有。
2.13 strip([chars])
用于移除字符串头尾指定的字符(默认为空格)或字符序列(如换行符)。
注意删除多个字符时:只要头尾有对应其中的某个字符即删除,不考虑顺序,直到遇到第一个不包含在其中的字符为止。
str = '123132231213321312==321312213231123132'
print(str.strip('123'))
打印结果为
==
2.14 title()
返回"标题化"的字符串,就是说所有单词的首个字母转化为大写,其余字母均为小写
2.15 格式化输出
%s 格式化字符串
%d 格式化整数
%f 格式化浮点数字,可指定小数点后的精度
%x — hex 十六进制
%d — dec 十进制
%o — oct 八进制
2.16 format 格式化函数
Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
基本语法是通过 {} 和 : 来代替以前的 % 。
format 函数可以接受不限个参数,位置可以不按顺序。
>>>"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序
'hello world'
>>> "{0} {1}".format("hello", "world") # 设置指定位置
'hello world'
>>> "{1} {0} {1}".format("hello", "world") # 设置指定位置
'world hello world'
3.元组 tuple
for x in (1, 2, 3): print (x,)
打印结果为
1
2
3
4.列表 list
列表是一个有序集合
关键字end可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符
for x in [1,2,3]:print (x,end='')
打印结果为
1 2 3
下面示例演示了列表的大部分方法:
count计数
>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print(a.count(333), a.count(66.25), a.count('x'))
2 1 0
插入、追加
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
索引
>>> a.index(333)#索引
1
移除、删除
>>> a.remove(333)#移除
#pop:删除最后一个元素
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
反转
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
排序
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]
enumrate #枚举
copy #复制
copy()和“=”赋值的区别:
使用“=”直接赋值,是引用其内存地址,更改一个,另一个同样会变, 例子中的a,b改变两次都影响到了对方
copy() 则顾名思义,复制一个副本,是新建一个内存地址,原值和新复制的变量互不影响。
但是,copy() 只是是浅度复制,深度复制还需要借助python的copy工具
a=[0,1,2,3,4,5]
b=a
c=a.copy()
del a[1]
'''
各变量值为:
a=[0, 2, 3, 4, 5]
b=[0, 2, 3, 4, 5]
c=[0, 1, 2, 3, 4, 5]
'''
b.remove(4)
'''
各变量值为:
a=[0, 2, 3, 5]
b=[0, 2, 3, 5]
c=[0, 1, 2, 3, 4, 5]
'''
c.append(9)
'''
各变量值为:
a=[0, 2, 3, 5]
b=[0, 2, 3, 5]
c=[0, 1, 2, 3, 4, 5, 9]
'''
4.1索引–可用于字符串、元组、列表
[起始:终止:步长]
起始和终止遵循左闭右开(太白说的顾首不顾腚)
5.字典 dict
特性:
- key-value结构
- key必须可hash、且必须为不可变数据类型、必须唯一
- value可存放任意多个值、可修改、可以不唯一
- 无序
- 查找速度快
键、值、键值对
1、dic.keys() 返回一个包含字典所有KEY的列表;
2、dic.values() 返回一个包含字典所有value的列表;
3、dic.items() 返回一个包含所有(键,值)元组的列表;
4、dic.iteritems()、dic.iterkeys()、dic.itervalues() 与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表;
新增
1、dic[‘new_key’] = ‘new_value’;
2、dic.setdefault(key, None) ,如果字典中不存在Key键,由 dic[key] = default 为它赋值;_
删除
1、dic.pop(key[,default]) 和get方法相似。如果字典中存在key,删除并返回key对应的vuale;如果key不存在,且没有给出default的值,则引发keyerror异常;
2、dic.clear() 删除字典中的所有项或元素;
3、del dic[‘key’]
修改
1、dic[‘key’] = ‘new_value’,如果key在字典中存在,'new_value’将会替代原来的value值;
2、dic.update(dic2) 将字典dic2的键值对添加到字典dic中
查看(用get)
1、dic[‘key’],返回字典中key对应的值,若key不存在字典中,则报错;
2、dict.get(key, default = None) 返回字典中key对应的值,若key不存在字典中,则返回default的值(default默认为None)
循环
1、for k in dic.keys()
2、for k,v in dic.items()
3、for k in dic
长度
1、len(dic)
6.集合 set
特性:
1.确定性(元素必须可hash)
2.互异性(去重)
3.无序性(集合中的元素没有先后之分),如集合{3,4,5}和{3,5,4}算作同一个集合。
注意:集合存在的意义就在于去重和关系运算
增加
单个元素的增加 : add(),add的作用类似列表中的append
对序列的增加 : update(),而update类似extend方法,update方法可以支持同时传入多个参数
删除
集合删除单个元素有两种方法:
元素不在原集合中时:
set.discard(x)不会抛出异常
set.remove(x)会抛出KeyError错误
pop():由于集合是无序的,pop返回的结果不能确定,且当集合为空时调用pop会抛出KeyError错误,
clear():清空集合
关系运算
交集:
set1&set2
差集:
set1-set2
set2-set1
并集:
set1|set2
对称差集:
set1.symmetric_difference(set2)
子集
set1.issubset(set2)
set1<=set2
四、运算符
1.算术运算
+ 加 - 两个对象相加
- 减 - 得到负数或是一个数减去另一个数
* 乘 - 两个数相乘或是返回一个被重复若干次的字符串
/ 除 - x 除以 y
% 取模 - 返回除法的余数
** 幂 - 返回x的y次幂
// 取整除 - 向下取接近除数的整数
2.比较运算
== 等于 - 比较对象是否相等
!= 不等于 - 比较两个对象是否不相等
> 大于 - 返回x是否大于y
< 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。
>= 大于等于 - 返回x是否大于等于y。
<= 小于等于 - 返回x是否小于等于y。
3.逻辑运算 与或非
and:布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。
or:布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。
not:布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。
4.赋值运算 =
= 简单的赋值运算符 c = a + b 将 a + b 的运算结果赋值为 c
+= 加法赋值运算符 c += a 等效于 c = c + a
-= 减法赋值运算符 c -= a 等效于 c = c - a
*= 乘法赋值运算符 c *= a 等效于 c = c * a
/= 除法赋值运算符 c /= a 等效于 c = c / a
%= 取模赋值运算符 c %= a 等效于 c = c % a
**= 幂赋值运算符 c **= a 等效于 c = c ** a
//= 取整除赋值运算符 c //= a 等效于 c = c // a
5.成员运算 in
in:如果在指定的序列中找到值返回 True,否则返回 False。
not in:如果在指定的序列中没有找到值返回 True,否则返回 False。
6.身份运算 is
is:是判断两个标识符是不是引用自一个对象
is not:是判断两个标识符是不是引用自不同对象
7.位运算
& 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0
| 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。
^ 按位异或运算符:当两对应的二进位相异时,结果为1
~ 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。~x 类似于 -x-1
<< 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。
>> 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数
8.运算符优先级
** 指数 (最高优先级)
~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % // 乘,除,取模和取整除
+ - 加法减法
>> << 右移,左移运算符
& 位 'AND'
^ | 位运算符
<= < > >= 比较运算符
<> == != 等于运算符
= %= /= //= -= += *= **= 赋值运算符
is is not 身份运算符
in not in 成员运算符
and or not 逻辑运算符
五、逻辑控制
1.if
PASS
2.while
条件循环
while 后面跟一个true或者false
3.for
遍历循环
for循环可以遍历任何序列的项目,如一个列表或者一个字符串
4.range函数
如果你需要遍历数字序列,可以使用内置range()函数。
跟切片类似,有起始值和结束值和步长