python基础
.python基础
python语言的特点
python的优点
-
python 的特点: Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。
-
python相比于其它语言(像java和c语言)一个很大的特点就是它是解释型语言,而java和c语言是编译型语言.
-
简洁
-
开源
-
规范的代码
# 规范的代码,多加空格运行结果可能不一样 # 下面代码无输出 age = 30 if age > 40: print('hello') print('world') age = 30 # 下面代码输出为'world' if age > 40: print('hello') print('world')
python的缺点
- 运行速度较慢
- 代码不能加密(解释型语言)
- 版本不能兼容(Python3不向下兼容Python2)
- 架构选择太多
2.python的应用场景
-
常规软件开发
-
科学计算
-
自动化运维
-
云计算
-
Web开发
-
网络爬虫
-
数据分析
-
人工智能
3.集成开发环境
•集成开发环境(Integrated Development Environment ),通常称为IDE.
•是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具
4.Bug
•程序中一切非正常现象称为bug
•排除程序故障称为debug
程序的执行方式分为两种,分别是运行模式和debug模式
5.注释
•程序中的注释其实就是对代码进行说明,并不参与程序的运行
•Python中的注释分为两种:单行注释和多行注释
单行注释
•单行注释也称为行注释
•单行注释以#开头,#右边的所有东西都被当做说明文字
•单行注释快键键是Ctrl+/
多行注释
•如果希望编写的注释信息很多,一行无法显示,就可以使用多行注释
•要在Python 程序中使用多行注释,可以用 一对 连续的 三个 引号(单引号和双引号都可以)
注释的作用
•单行代码添加说明
•整段代码添加说明
•调试程序
•记录工作日志(TODO)
变量
•变量:描述计算机中的数据存储空间
•变量作用:在计算机内存中保存数据
变量的命名规则
•1.只能由数字,字母,_(下划线)组成
•2.不能以数字开头
•3.不能是关键字
•4.区分大小写
不同变量类型之间的运算
•1.数值型变量之间可以直接计算
•2.字符串之间使用+拼接字符串
•3.字符串变量和整型使用重复拼接相同的字符串
•4.数值变量和字符串不能进行其它计算
转换输入数据类型
•float()函数将输入的数据转换为浮点类型
•int()函数将输入的数据转换为整型
条件控制语句if
•程序满足特定的条件才能执行特定的代码
•条件控制语句使用if关键字
import导包
import random human = int(input('请输入要出的拳(1:石头,2:剪刀,3:布)')) computer = random.randint(1,3)
while循环和for循环
•循环的作用就是让指定的代码 重复的执行
•while循环最常用的应用场景就是 让执行的代码 按照 指定的次数 重复 执行
循环变量和死循环
•循环变量主要作用是控制循环什么时候停止下来
•可以debug查看循环变量的执行过程
•死循环指的是程序持续执行,无法终止,原因通常是忘记在循环内部修改循环变量的值
break和continue
•break 和 continue 是专门在循环中使用的关键字
•break某一条件满足时,不再执行循环体中后续重复的代码,并退出循环
•continue某一条件满足时,不再执行本次循环体中后续重复的代码,但进入下一次循环判断,在整个循环中,只有某些条件,不需要执行循环代码,而其他条件都需要执行
- continue中一定要把修改循环变量放在前面
pass语句
•pass 是空语句,是为了保持程序结构的完整性
•pass不做任何事情,一般用做占位语句
for循环
•for循环的主要作用是遍历数据(容器)中的元素
•任何可迭代的数据都能通过for循环遍历(‘hello’)
range区间
•range()可创建一个整数列表,一般用在 for 循环中。
•可以把python的range()理解成数学中的左闭右开区间(包含左,不包含右,例如range(0,100)表示[0,100))
len和元素获取
•len(容器)可以获取容器中元素个数
•字符串元素获取可以通过:字符串[角标]
循环…else
•else中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行,while循环也一样
列表的操作–排序
sort()…升序
sort(reserve=True)…降序
reverse …逆序,反转
列表的操作–最值
max() …最大值
min()…最小值
冒泡排序
str = [9, 80, 7, 30, 5, 4, 3, 2, 1]
i = 0
while i<len(str):
j=0
while j<len(str)-i-1:
if str[j]>str[j+1]:
temp = str[j+1]
str[j+1]=str[j]
str[j]=temp
j+=1
i+=1
print(str)
选择排序
选择排序,l=[0,9,3,2,4,56,7]
l = [0, 9, 3, 2, 4, 56, 7]
i=0
while i<len(l):
min = i
j=i+1
while j<len(l):
if l[j]<l[min]:
min=j
j+=1
temp = l[i]
l[i]=l[min]
l[min]=temp
i+=1
print(l)
列表的嵌套
•一个列表中的元素又是一个列表,那么这就是列表的嵌套
元组(tuple)
Python的元组与列表类似,不同之处在s于元组的元素不能修改
元组的定义
tuple1=(50,)
tuple2=('易建联','姚明,''孙悦')
print(tuple1)
print(tuple2)
print(type(tuple2))
元组的应用场景
•作为自动组包的默认类型
•自动解包
•交换数据
•格式化输出
•让列表不可被修改,保护数据安全
数据交换
•交换数据是自动组包和解包的过程
函数
•函数是计算机执行命令的单元
•所谓函数,就是把 具有独立功能的代码块组织为一个整体,在需要的时候 调用
•函数的使用包含两个步骤:
1. 定义函数 —— 在函数中编写代码,实现功能
2. 调用函数 —— 执行编写的代码
•函数的作用,在开发程序时,使用函数可以提高编写的效率以及代码的重用
函数的文档注释
在定义函数的下方,使用连续的三对引号,在三对引号之间,编写对函数的说明文字
在函数调用的位置,使用ctrl+Q快捷键查看文档注释
函数参数
•函数的参数,可以. b传递数据给函数内部
•参数的作用是增加函数的通用性
形参和实参
形参:即形式参数,由于他不是实际存在的变量,所有又称为’‘虚拟变量’’.形参是函数调用时用于接受实参的变量.
实参:全称为’‘实际参数’’,指在调用时传递给函数的参数
形参的作用域
•形参的作用域只在定义函数的代码块 中,一旦超出该范围就不能再使用了
•不同的函数中,可以有同名的形参,不会相互影响
•作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突。
•函数间的形参是不能相互使用的
匿名函数lambda
lambda的定义格式:lambda 参数:表达式
高级变量类型
set集合
1.集合是无序的,集合中的元素是唯一的
2.set集合的作用:一般是对列表或者元组进行去重操作
集合添加元素
add():直接把元素加入到集合中
update():把要添加的元素拆分,单独加入到集合中
集合删除元素
•remove删除,如果有直接删除 如果没有 程序报错
•pop删除,随机删除集合中的元素,如果集合没有元素,则程序报错
•discard删除,元素存在直接删除 如果元素不存在 不做任何操作
集合的交集、子集和超集、并集、异或、差集
•s1.issubset(s2) s1是否是s2的子集
•s2.issuperset(s1) s2是否是s1的超集
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h6ZYEoy5-1581258542314)(img/2.png)]
字符串的基本操作—获取元素和遍历
1.获取元素
2.遍历字符串中的元素
字符串的基本操作—判断
1.isalpha():如果string至少有一个字符,并且所有字符都是字母,则返回True
2.isdecimal():如果字符串只包含数字,则返回True
3.islower:如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的字符)字符都是小写,则返回True
4.isupper():如果string中包含至少一个区分大小写的字符,并且所有这些字符都是大写,则返回True
5.startwith(str):检查字符串是否以str开头,是则返回True
6.endswith(str):检查字符串是否以str结尾,是则返回True
字符串的基本操作—查找和替换
1.find(str, start=0, end=len(string)):检测 str 是否包含在 string 中,如果 start 和 end
指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回 -1
2.rfind(str, start=0, end=len(string)):类似于 find(),不过是从右边开始查找
3.index(str, start=0, end=len(string)):跟 find() 方法类似,不过如果 str 不在 string 会报错
4.rindex(str, start=0, end=len(string)):类似于 index(),不过是从右边开始
5.replace(old_str, new_str, num=string.count(old)):返回一个新字符串,把 string 中的 old_str 替换成 new_str,如果 num 指定,则替换不超过 num 次
字符串的操作—拆分和连接
1.partition(str):返回元组,把字符串 string 分成一个 3 元素的元组 (str前面, str, str后面)
2.rpartition(str):类似于 partition() 方法,不过是从右边开始查找
3.split(str="", num):返回列表,以 str 为分隔符拆分 string,如果 num 有指定值,则仅分隔 num + 1 个子字符串,str默认包含 ‘\r’, ‘\t’, ‘\n’ 和空格
4.splitlines():返回列表,按照行(’\r’, ‘\n’, ‘\r\n’)分隔
5.string1 + string2:拼接两个字符串
6.join(seq):返回字符串,以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
字符串的操作—大小写转换
1.lower():返回新字符串,转换 string 中所有大写字符为小写
2.upper():返回新字符串,转换 string 中的小写字母为大写
字符串操作–文本对齐
1.ljust(width):返回新字符串,基于原字符串左对齐,并使用空格填充至长度 width(可以指定填充字符)
2.rjust(width):返回新字符串,基于原字符串右对齐,并使用空格填充至长度 width(可以指定填充字符)
3.center(width):返回新字符串,基于原字符串居中,并使用空格填充至长度 width(可以指定填充字符)
字符串操作–去除空白字符
1.lstrip():返回新字符串,截掉 string 左边(开始)的空白字符(可以指定截掉的字符)
2.rstrip():返回新字符串,截掉 string 右边(末尾)的空白字符(可以指定截掉的字符)
3.strip():返回新字符串,截掉 string 左右两边的空白字符(可以指定截掉的字符)
字典(dict)
1.字典同样可以用来存储多个数据
2.字典用{}来定义
3.字典没有多音,是无序的
3.字典使用键值对存储数据,键值对之间用 , 分隔
键key是索引
值value是数据
键和值之间用: 分隔
值可以取任何数据类型,但键只能使用字符串,数字或者元组
键必须是唯一的
字典的新增,删除,查询
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iTQSeY3e-1581258542315)(img/3.png)]
字典的查询和遍历
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uqOL25O5-1581258542316)(img/4.png)]
公共语法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kltXBTRs-1581258542317)(img/5.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qw0fCbVk-1581258542317)(img/6.png)]
切片
•切片译自英文单词slice,一部分
•切片根据 步长从原序列中取出一部分元素组成新序列
•切片适用于字符串 列表 元组
切片格式
字符串[开始索引:结束索引:步长]
步长为负数,代表逆序切割.
列表推导式
•所谓的列表推导式,就是指的轻量级循环创建列表
•列表推导式格式:[计算公式for循环 if判断]
集合推导式
集合推导式格式:{计算公式 for循环 if判断}
字典推导式
字典推导式格式:{key:value for循环 if判断}
数据类型之间的转换[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zM4TdQpy-1581258542318)(img/7.png)]
默认参数
•形参设定默认值称为 默认参数
•调用函数时,如果没有传入默认参数对应的实参,则实参使用默认值
•默认参数在调用的时候可以不传递,也可以传递
•注意:默认参数一定要在参数的最后
关键字参数
•调用函数时,实参可以指定对应的形参,称为 关键字参数
•调用函数的时候,可以指定形参的名称,并且可以改变传递参数的顺序.
可变参数*args
•可变参数,用于接收任意数量的参数
•可变参数的前边需要添加*,用于提示python解释器该参数为可变参数
•可变参数的本质是将传递的参数包装成了元组
可变参数kwargs
•可变参数还有一种形式可以接收不存在的关键字参数
•定义参数时需要在变量名前添加两个*
•这种可变参数会将 不存在的关键字参数包装成字典
递归
•如果一个函数在内部调用其本身,这个函数就是 递归函数
•递归:把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
•只需少量的程序就可描述出解题过程所需要的多次重复计算
map()函数
'''
[1, 2, 3, 4, 5, 6, 7, 8, 9]
将列表中元素变成它的平方
'''
l=[1, 2, 3, 4, 5, 6, 7, 8, 9]
l2=map(lambda ele:ele*ele,l)
print(list(l2))
l2=[1, 4, 9, 16, 25, 36, 49, 64, 81]
filter()函数
'''
l = ['林青霞','张曼玉','胡慧中','高圆圆','张曼玉']
找到列表中所有的张曼玉
'''
l = ['林青霞', '张曼玉', '胡慧中', '高圆圆', '张曼玉']
l2 = filter(lambda ele: ele == '张曼玉', l)
print(list(l2))
reduce()函数
'''
l = [1,2,3,4,5,6]
求出列表中所有元素的和
注意:python3移除了reduce,需要在functools包中导入
'''
import functools
l = [1,2,3,4,5,6]
l2=functools.reduce(lambda x,y:x+y,l)
print(l2)
面向对象
•面向对象和面向过程都是一种编程思想
•面向对象:OOP(Object Oriented Programming)
•面向过程:POP(Process Oriented Programming)
面向对象,强调的是对象(实体)
面向对象的出现,让曾经在过程中的执行者,变成了对象中的指挥者.
类和对象
•类是描述了一种类型
•对象是这个类型的具体实现
__init__方法
•__init()__是一个内置的方法
•当对象创建的时候就会自动执行__init__()方法
__str__方法
这个方法主要用于将对象转化为适合人阅读的形式
运算符重载
运算符重载:对于±*/ 等运算来说,其实就是一个函数
属性私有化
•将属性设置为不能在外部修改,就是属性私有化
属性私有化格式:
self.__属性名 = 属性值
属性私有化作用
保护数据安全
方法私有化
•私有化的方法,不能通过对象调用,只能在类内部调用
•方法的私有化方式和属性私有化方式一样
方法私有化的作用
•方法私有化的主要作用是进行对象的封装
面向对象的三大特征
1.封装
•封装就是隐藏内部实现的细节,只保留功能接口
封装的范围
•1.封装属性
•2.封装成方法/函数
•3.封装成类
•4.封装模块和包
2.继承
•继承指的是一个对象直接使用另一个对象的属性或方法
继承的好处
•1.提高了代码的复用性
•2.让类与类之间发生了关系,为多态提供了前提
继承关系结构图
•可以通过类名.__mro__查看继承结构图,也就是继承链
•所有对象都是继承自object
重写父类中的方法
•有时,父类中方法的实现不满足子类的需求,子类继承父类之后可以修改父类中的方法实现
init和属性继承问题
•继承之后,就默认继承了父类中公有的属性,子类中可以直接使用,也可以修改
•子类复写init方法之后,就不能再使用父类init中定义的成员属性了
•如果重写init方法后还要使用父类的成员属性,就需要在init方法中调用父类的init方法
多继承方法和属性总结
1.多继承可以直接使用多个父类中的方法
2.多继承中,子类没有成员属性,如果多个父类都有成员属性,只能使用前一个父类的成员属性
3.多继承中,子类没有成员属性,如果只有一个父类有成员属性,不论继承的顺序,都能使用这个成员属性
4.如果需要使用所有父类的成员属性,需要重写init方法,调用多个父类的init方法
多层继承
•多层继承可以访问所有父类中公共的方法和属性
3.多态
•多态指的是一类事物有多种形态(一个类有多个子类,多态的概念依赖于继承)
类属性
•我们希望对于不同的属性,每个对象开辟一块内存空间,对于相同的属性能够公用一块空间存储就行了,这是要用到类属性
定义格式:
class 类名:
类属性名=属性值
模块和包
•Python中模块就是一个.py文件
•模块中可以定义函数,变量,类
•模块可以被其他模块引用
整体导入
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ijzHlzLd-1581258542318)(img/9.png)]
局部导入
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3K1lWiN-1581258542319)(img/10.png)]
局部导入所有
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-60jsiUT1-1581258542319)(img/11.png)]
局部导入冲突
1.引入是有先后顺序的
2.名称相同通过as关键字进行重命名
全部导入冲突
全部引入时产生冲突,建议不要用import *的方式,采用import 模块的方式。
使用时加上模块名称
模块内置成员
内置变量 __ name__
•如果将当前模块作为启动项,__ name _ 值为”_ main__”
如果当前模块当作依赖引入,_ name 值不为” _main _”
内置函数dir()
•可以查询出模块内定义的所有名称(变量名,函数名,类名)
•dir(): 查询当前模块
•dir(模块名): 查询指定模块
包
•包就是个文件夹
•用来放模块的
•限定了模块的命名空间
包的作用
•用来管理模块的
•让业务更清晰化
•解决一些命名的问题
引入包中的模块
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GgJHmYuY-1581258542319)(img/12.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NQcPPVuM-1581258542320)(img/13.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E4b3hnDe-1581258542320)(img/14.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vBwos6fM-1581258542320)(img/15.png)]
系统内置模块
Sys系统相关
•sys.argv 获得启动时的参数
•sys.path 获取加载的环境
•sys.exit()程序退出
Time时间相关
•time.time()获取当前时间戳,单位时秒,(相对于1970年的0点0时0分0秒)
•time.sleep(秒)阻断程序
Math数学运算
•math.pow求幂
•math.floor取下
•math.ceil取上
•round四舍五入
•math.sin cos tan…
random随机数
•random.randint(start,end)随机整数,[start,end]
•random.random()随机浮点数, [0,1)
•random.uniform(start,end)随机浮点数, [start,end]
•random.choice([])随机数组,返回单个元素
•random.choices([])随机数组,返回列表
异常
•程序在运行过程中,发生了未知的事件,影响到了程序的正常运行
•异常是一种事件
•异常会影响到程序正常运行
异常捕获
try except结构:
用来捕获异常,让程序在出现异常的情况下不至于终止,能防范于未然。
try中我们放可能存在异常的逻辑。
except中我们来放出现异常后处理异常的逻辑。
try finally结构:
程序在出现异常的时候,程序的正常执行时会s受到影响的.
无论是否出现异常,finally中的代码块一定会去执行的。
try except finally结构:
程序在出现异常的时候,程序的正常执行时会收到影响的。
但是,出现异常后,finally中的代码块是照样会执行的。
try except else finally结构:
程序在出现异常的时候,程序的正常执行时会收到影响的。
如果try中逻辑没有出现异常,则会执行else中的逻辑
如果try中逻辑出现异常,则不会执行else中的逻辑
但是,出现异常后,finally中的代码块是照样会执行的。
异常类型
IndexError:数组下标越界
KeyError:不存在的字典key
ValueError:值类型错误
AttributeError:属性,函数,类不存在的错误
自定义异常
BaseException是所有异常的基类。
Excetpion直接继承自BaseException。
其他所有的异常不是间接就是直接继承自Exception。
自定义的异常:提供错误信息作为显示,继承Exception类
'''
自定义异常继承Exception
'''
class CustomException(Exception):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
raise CustomException('错误的信息')
异常嵌套
嵌套时,内部异常先捕获,如果不能捕获,再由外部异常捕获
多重捕获
总结:根据异常的不同进行捕获,捕获后可以采取不同的处理方案。
返回值问题
总结:
finally中有返回值时,结果一定为finally中的返回值,因为她时最后执行的。
在finally中返回值,这种行为不可取,通常一个函数只有一个地方进行返回。