第一章 变量、常用循环体、代码结构、代码练习
第二章 列表、元组等数据结构、字符串驻留机制及字符串格式化操作
第三章 函数、面向对象、文件操作、深浅拷贝、模块、异常及捕获
第四章 项目打包、类和对象高级、序列、迭代器、生成器、装饰器
第五章 正则表达式、json、logging日志配置、数据库操作、枚举、闭包、匿名函数和高阶函数、time、datetime
第六章 Socket编程、多线程(创建方式、线程通信、线程锁、线程池)
简介
Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。
- Python 是一种解释型语言: 这意味着开发过程中没有了
编译
这个环节。类似于PHP和Perl语言。 - Python 是交互式语言: 这意味着,您可以在一个 Python 提示符 >>> 后直接执行代码。
- Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。
- Python 是初学者的语言: 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到 WWW 浏览器再到游戏
Python 应用
- Youtube - 视频社交网站
- Reddit - 社交分享网站
- Dropbox - 文件分享服务
- 豆瓣网 - 图书、唱片、电影等文化产品的资料数据库网站
- 知乎 - 一个问答网站
- 果壳 - 一个泛科技主题网站
- Bottle - Python微Web框架
- EVE - 网络游戏EVE大量使用Python进行开发
- Blender - 使用Python作为建模工具与GUI语言的开源3D绘图软件
- Inkscape - 一个开源的SVG矢量图形编辑器。
环境搭建
Python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。
先下载,安装,windows为例
直接下载完,安装即可,记得勾选 Add to Path
,不然还要再配置下环境变量。。
自定义安装即可,配置给所有用户可用
完成后,cmd到控制台
python -V # 查看版本号
运行python
-
交互式
cmd 下,直接
python
进入交互页C:>python # Windows/DOS
-
命令行脚本
python py文件
即可**注意:**在执行脚本时,请检查脚本是否有可执行权限。
C:>python script.py # Windows/DOS
-
集成开发 IDE (PyCharm) 破解企业版即可、或者用 VSCode
第一个Python3.x程序
查看 python版本
python -V
# 或
python --version
hello.py
创建一个hello.py文件
#!/usr/bin/python3
print("Hello, World!")
python命令执行
$ python hello.py
以上输出结果
Hello, World!
输出到文件中
有点类似java的io流
fi = open('D:/text.txt', 'a+') # 文件不存在时会自动创建文件 a+ 表示文件追加模式
print("hello world", file = fi)
fi.close()
Python基础
python中,一切皆是对象。
编码格式
默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码:
# -*- coding: cp-1252 -*-
转义符
\ + 要实现的转移功能首字母
\n :换行
\t :一个制表位table
原字符
使字符串中的转义字符不起作用,使用方式:在字符串之前加 r或者R
注意;最后一个字符不能是一个 \ ,可以是 \\
print(r"hello\nworld")
print(R"hello\nworld")
标识符
- 第一个字符必须是字母表中字母或下划线 _ 。
- 标识符的其他的部分由字母、数字和下划线组成。
- 标识符对大小写敏感。
Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型
变量
变量有三部分组成
- 标识,表示对象的内存地址,id(obj)可获取
- 类型,对象的数据类型,type(obj)可获取
- 值,对象存储的具体数据,print(obj)可打印输出
变量多次赋值后,变量会更变存储的内存地址,没有被变量指向的内存中的数据,被称之为垃圾数据,会进行数据回收
内存分析图
多变量赋值
a = b = c = 1 # 链式赋值
a, b, c = 1, 2, "wlh" # 解包赋值
a, b, c = tuple('1', '2', '3') ==》 a,b,c = 1,2,3 #解包赋值
变量互换值
a, b = 1, 2
a, b = b, a
python保留字
and | exec | not |
---|---|---|
assert | finally | or |
break | for | pass |
class | from | |
continue | global | raise |
def | if | return |
del | import | try |
elif | in | while |
else | is | with |
except | lambda | yield |
python查看保留字
import keyword
print(keyword.kwlist)
注释
- 单行注释:Python中单行注释以 # 开头
# 第一个注释
print("hello python")
- 多行注释
'''
或者"""
'''
第三注释
第四注释
'''
"""
第五注释
第六注释
"""
print ("Hello, Python!")
行与缩进
python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} 。
缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数
if True:
print ("True")
else:
print ("False")
多行语句
Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠 ** 来实现多行语句
total = item_one + \
item_two + \
item_three
在 [], {}, 或 () 中的多行语句,不需要使用反斜杠 \
total = ['item_one', 'item_two', 'item_three',
'item_four', 'item_five']
数据类型
标准数据类型
Python3 中有六个标准的数据类型:
- Number(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Set(集合)
- Dictionary(字典)
Python3 的六个标准数据类型中:
- **不可变序列(3 个):**Number(数字)、String(字符串)、Tuple(元组);
- **可变序列(3 个):**List(列表)、Dictionary(字典)、Set(集合)。
Number数字类型
python中数字有四种类型:整数、布尔型、浮点数和复数。
- int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
- bool (布尔), 如 True,False
- float (浮点数), 如 1.23、3E-2
- complex (复数), 如 1 + 2j、 1.1 + 2.2j
整数类型 int
整数可以表示为二进制、十进制、八进制、十六进制
print('十进制', 188)
print('二进制', 0b10011001) # 0b开头
print('八进制', 0o176) # 0o开头
print('十六进制', 0x1EAF) # 0x开头
浮点数类型 float
浮点数的存储不精确,可能出现小数位数不确定的情况
解决方案: 导入decimal模块,使用Decimal()函数即可
from decimal import Decimal
print(Decimal('1.1') + Decimal('2.2'))
布尔类型 bool
取值两种,True(1)和False(0)
可以转化为整数
f1 = True
print(f1) # 结果为 True
print(f1 + 1) # 结果为 2
字符串(String)
- Python 中单引号 ’ 和双引号 " 使用完全相同。
- 使用三引号(‘’’ 或 “”")可以指定一个多行字符串。
str='''人生苦短,
我用python
'''
print(str)
- 转义符 \。
- 反斜杠可以用来转义,使用 r 可以让反斜杠不发生转义。 如 r"this is a line with \n" 则 \n 会显示,并不是换行。
- 按字面意义级联字符串,如 "this " "is " “string” 会被自动转换为 this is string。
- 字符串可以用 + 运算符连接在一起,用 ***** 运算符重复。
- Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始。
- Python 中的字符串不能改变。
- Python 没有单独的字符类型,一个字符就是长度为 1 的字符串。
- 字符串的截取的语法格式如下:变量[头下标:尾下标:步长]
# 转义 \n 换行
name = 'wlh\nhello'
print(name)
print('------------------使用原字符去除转义')
# 使用原字符去除转义
name = r'wlh\nhello'
print(name)
print('------------------级联字符串')
# 级联字符串
name = 'wlh''\n''hello'
print(name)
print('------------------字符串 + 运算符 用 * 表示重复')
# 字符串 + 运算符 用 * 表示重复
name = 'wlh'
print(name * 2)
print('------------------Python 中的字符串有两种索引方式')
# Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始
name = 'Python'
# 获取 'P' 两种方式
print(name[0], name[-6])
# 字符串的截取
# 变量[头下标:尾下标:步长]
# 获取 'Pyt'
print(name[0:3])
#获取 on
print(name[4:6])
数据转换函数
-
str()
name = '张三' age = 20 print('我叫' + name + ',今年' + str(age) + '岁')
-
int()
抹零取整
如果字符串转为int,那么字符串必须是 纯数字串,有小数也不行
str1 = '198' print(type(int(str1))) # int类型 f1 = 198.2 print(int(f1)) # 值 198 print(int(True)) # 输出 1
-
float()
末尾.0占位
如果字符串转为float,那么字符串必须是 数字串,可以有小数,非数字串则会报错
in1 = 200 in1 = float(in1) print(in1) # 200.0
判断数据类型
- type()
- isinstance()
a = 111
isinstance(a, int) # 返回True
type(a) # 返回<class 'int'>
两者的区别:
- type()不会认为子类是一种父类类型。
- isinstance()会认为子类是一种父类类型
注意:Python3 中,bool 是 int 的子类,True 和 False 可以和数字相加
,True1、False0 会返回True,但可以通过is
来判断类型。
issubclass(bool, int) # 判断 bool是否是 int的子类
True
True==1
True # 返回True
True+1 # 返回2
等待用户输入 input
input用户输入后的结果类型是str,如果涉及到运算,请注意转换数据类型
用户输入后,给name赋值
name = input("请输入用户名")
a = int(input('输入一个加数'))
b = int(input('输入另一个加数'))
print(a + b)
同一行显示多条语句
Python 可以在同一行中使用多条语句,语句之间使用分号 ;
分割
import sys; x = 'wlh';
print输出
print
默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=""
# 换行输出
print( x )
print( y )
# 不换行输出
print( x, end=" " )
print( y, end=" " )
导入包import 与 from…import
在 python 用 import
或者 from...import
来导入相应的模块。
将整个模块(somemodule)导入,格式为: import somemodule
从某个模块中导入某个函数,格式为: from somemodule import somefunction
从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
将某个模块中的全部函数导入,格式为: from somemodule import *
运算符
算数运算符
以下假设变量: a=10,b=20:
+ | 加 - 两个对象相加 | a + b 输出结果 30 |
---|---|---|
- | 减 - 得到负数或是一个数减去另一个数 | a - b 输出结果 -10 |
* | 乘 - 两个数相乘或是返回一个被重复若干次的字符串 | a * b 输出结果 200 |
/ | 除 - x除以y | b / a 输出结果 2 |
% | 取模 - 返回除法的余数 | b % a 输出结果 0 注意公式 余数=被除数-除数*商 |
** | 幂 - 返回x的y次幂 | a**b 为10的20次方, 输出结果 100000000000000000000 |
// | 取整除 - 返回商的整数部分(向下取整) | >>> 9//2 4 |
赋值运算符
以下假设变量a为10,变量b为20:
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | 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 |
赋值方式:
# 链式赋值
a = b = c = 20 # 注意,abc三个变量是指向同一块内存空间
print(a, b, c)
# 参数赋值
a += 20
print(a)
# 解包赋值
d, e, f = 10, 20, 30
print(d, e, f)
# python变量值交换(简单的一批)
h,j=10,20
h,j=j,h # 现在 h=20,j=10
比较运算符
以下假设变量a为10,变量b为20:
运算符 | 描述 | 实例 |
---|---|---|
== | 等于 - 比较对象是否相等(比较的是值) | (a == b) 返回 False。 |
!= | 不等于 - 比较两个对象是否不相等 | (a != b) 返回 true. |
<> | 不等于 - 比较两个对象是否不相等。python3 已废弃。 | (a <> b) 返回 true。这个运算符类似 != 。 |
> | 大于 - 返回x是否大于y | (a > b) 返回 False。 |
< | 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。 | (a < b) 返回 true。 |
>= | 大于等于 - 返回x是否大于等于y。 | (a >= b) 返回 False。 |
<= | 小于等于 - 返回x是否小于等于y。 | (a <= b) 返回 true。 |
比较对象的标识是否相同,使用 is
关键字
比较对象的标识是否不同,使用 is not
关键字
a, b = 10, 10 # 由于对象10已经存在,在内存中则只创建一次
print(a == b) # 比较的是变量的值是否相等(Value值) True
print(a is b) # 比较的是变量的标识是否相等(id值) True
# 以数组为例
list1 = [11,22,33]
list2 = [11,22,33] # list1和list2是不同的对象,虽然值相同
print(list1 == list2) # 比较value (True)
print(list1 is list2) # 比较id (False)
print(list1 is not list2) # 比较id (True)
逻辑运算符
Python语言支持逻辑运算符,以下假设变量 a 为 10, b为 20:
运算符 | 逻辑表达式 | 描述 | 实例 |
---|---|---|---|
and | x and y | 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 | (a and b) 返回 20。 |
or | x or y | 布尔"或" - 如果 x 是非 0,它返回 x 的计算值,否则它返回 y 的计算值。 | (a or b) 返回 10。 |
not | not x | 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 | not(a and b) 返回 False |
成员运算符
除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。
运算符 | 描述 | 实例 |
---|---|---|
in | 如果在指定的序列中找到值返回 True,否则返回 False。 | x 在 y 序列中 , 如果 x 在 y 序列中返回 True。 |
not in | 如果在指定的序列中没有找到值返回 True,否则返回 False。 | x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。 |
list = [11,22,33,44]
a = 11
if a in list:
print('a在列表中')
else:
print('a不在列表中')
身份运算符
身份运算符用于比较两个对象的存储单元
运算符 | 描述 | 实例 |
---|---|---|
is | is 是判断两个标识符是不是引用自一个对象 | x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False |
is not | is not 是判断两个标识符是不是引用自不同对象 | x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。 |
# 以数组为例
list1 = [11,22,33]
list2 = [11,22,33] # list1和list2是不同的对象,虽然值相同
print(list1 == list2) # 比较value (True)
print(list1 is list2) # 比较id (False)
print(list1 is not list2) # 比较id (True)
位运算符
下表中变量 a 为 60,b 为 13,二进制格式如下:
& | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 | (a & b) 输出结果 12 ,二进制解释: 0000 1100 |
---|---|---|
| | 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 | (a | b) 输出结果 61 ,二进制解释: 0011 1101 |
^ | 按位异或运算符:当两对应的二进位相异时,结果为1 | (a ^ b) 输出结果 49 ,二进制解释: 0011 0001 |
~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1 | (~a ) 输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式。 |
<< | 左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。 | a << 2 输出结果 240 ,二进制解释: 1111 0000 移动一位相当于*2,移动两位=60*4=240 |
>> | 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数 | 向右移动一位,相当于除以2了,移动两位除以4,三位除以8 |
运算符优先级
()括号优先 -->算数运算 --> 位运算 --> 比较运算 --> 布尔运算 --> 赋值运算
程序的组织结构
计算机的流程控制主要分为三种结构:
- 顺序结构
- 选择结构 -if语句
- 循环结构 - while 、for -in 语句
对象的布尔值
python一切皆对象
获取对象的布尔值: 使用内置函数 bool(obj)
以下对象的布尔值为False
- False
- 数值0
- None
- 空字符串
- 空列表
- 空元组
- 空字典
- 空集合
以下值都为False
print(bool(False)) # False值
print(bool(0)) # 0
print(bool(0.0)) # 0.0
print(bool(None)) # None值
print(bool('')) # 空字符
print(bool([])) # 空数组
print(bool(list())) # 空数组
print(bool(())) # 空元组
print(bool(tuple())) # 空元组
print(bool({
})) # 空字典
print(bool(dict())) # 空字典
print(bool(set())) # 空集合
其他值都为True
print(bool(True))
print(bool(18))
print(bool('111'))
......
对象放入条件判断
上面得知,对象的布尔值,所以我们在写程序时,可以将对象直接放入条件判断语句中,简化代码
示例
age = int(input('请输入你的年龄'))
if age: # 当 age 不为 0 时,age的bool值为True,所以可直接放入判断中
print('年龄为:', age)
else:
print('格式不正确')
选择结构
单分支结构
语法结构:
if 条件表达式:
条件执行体
图示
示例:
money = 2000
s = int(input('输入取款金额'))
if money >= s:
money -= s
print('余额充足,取款成功,余额为:', money)
双分支结构
# 语法
if 条件表达式:
条件执行体1
else:
条件执行体2
示例:
num = int(input('请输入一个整数'))
if num % 2 == 0:
print('是偶数')
else:
print('是奇数')
多分支结构
# 语法
if 条件表达式1:
条件执行体1
elif 条件表达式2:
条件执行体2
...
[else:]
条件执行体else
示例:
score = int(input('请输入你的成绩'))
if 90 <= score <= 100:
print('优')
elif score >= 80:
print('良')
else:
print('差,继续努力')
条件表达式
条件表达式是if…else的简写
语法:
# 如果判断条件为True,此表达式返回值为 x ,否则返回 y
x if 判断条件 else y
示例:
num_a = int(input('请输入第一个整数'))
num_b = int(input('请输入第二个整数'))
print(str(num_a) + '大于等于' + str(num_b) if num_a >= num_b else str(num_a) + '小于' + str(num_b))
pass语句
语句什么都不做,只是一个占位,用在先搭建语法结构,还没想好怎么写的时候
可以配合哪些语句使用:
- if语句的条件执行体
- for-in语句的循环体
- 定义函数的函数体
示例:
num = 100
if num == 100:
pass
else:
print('a')
循环结构
range()内置函数的使用
用于生成一个整数序列,返回值是一个迭代器对象
示例
# 第一种创建方式
r = range(10) # 默认从 0 开始, 步长默认为 1 [0,10) 半闭半开区间,其中不包括10
print(list(r)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 把r转换成了列表类型
# 第二种创建方式
r = range(1, 10) # 从1开始, 步长默认为 1
print(list(r)) # [1, 2, 3, 4, 5, 6, 7, 8, 9] 把r转换成了列表类型
# 第三种创建方式
r = range(1, 10, 2) # 从1开始, 步长为 2
print(list(r)) # [1, 3, 5, 7, 9] 把r转换成了列表类型
# 判断10 是否在这个整数序列中
print(10 in r) # False
range类型的优点:
不管range对象表示的整数序列有多长,所有的range对象占用的空间都是一样的,因为仅仅需要存储start,stop,step,只有用到range对象的时候,才回去计算序列中的相关元素。
while循环
# 语法
while 条件表达式:
条件执行体
示例:
a = 1
while a < 5:
print(a)
a += 1
练习: 1-100之间的偶数和
a = 1
sum = 0
while a <= 100:
if not a % 2: # a %2==0时,bool值是False,然后取反即可
sum += a
a += 1
print(sum)
for-in 循环
in 表达从(字符串、序列等)中依次取值,又称遍历
for-in遍历的对象必须是可迭代的对象
语法:
for 自定义的变量 in 可迭代对象:
循环体
示例:
for item in 'Hello World':
print(item)
b = range(10) # 从0-9
for item in b:
print(item, end='') # 0123456789 ,end=''表示一行显示
如果在循环体中没有用到自定义的变量,可以将变量写作 _
for _ in range(4):
print('hello world') # 循环四次hello world
练习1:使用for循环计算1-100偶数和
sum = 0
for i in range(1, 101, 1):
if not i % 2:
sum += i
print(sum)
练习2:输出100-999之间的水仙花数
个位、十位、百位所有数的3次方的和 = 本身
举例: 153=3*3*3+5*5*5+1*1*1
for item in range(100,1000):
ge = item % 10
shi = item // 10 % 10
bai = item // 100
if ge**3 + shi**3 + bai**3 == item:
print(item)
break
结束循环结构,通常和if分支结构一起使用
for item in range(3):
if item == 1:
print('1')
break
continue
用于结束当前的循环,进入下一个循环,通常和if一起使用
示例:
输出1-50之间,5的倍数
for item in range(1,51):
if item % 5:
continue
print(item)
else的使用
示例
for item in range(3):
pwd = input('请输入你的密码')
if pwd == '8888':
print('密码正确')
break
else:
print('密码错误')
else: # 当for循环中执行了break后,与for配合使用的else将不会起作用
print('三次密码均输入错误')
嵌套循环
内循环和外循环
练习1:输出一个三行四列的矩形
for i in range(3):
for j in range(4):
print('*', end='\t')
print() # 换行
练习2:生成一个树,n行就有n个*
for i in range(1,10): # 外循环表示行数 [1,10) 一共9行
for j in range(1, i + 1):
print('*',end='')
print()
练习3:九九乘法表
for i in range(1,10):
for j in range(1, i + 1):
print(j, '*', i, '=', i * j, end='\t')
print()