python的起源
由荷兰程序员吉多.范罗苏姆在1989年圣诞节时基于abc语言开发而成,1991发行v1.0正式版,python是蟒蛇的意思,python应用非常广泛,数据分析(爬虫)、web(django flask)、自动化测试与运维、人工智能具有涉猎。
python的环境搭建
python官网下载地址:https://www.python.org/downloads/release
下载后双击安装
1)点击“Next”,直到结束。
2)在安装过程中注意点击“Add Python 版本号 to PATH”,不点击需要手动配置python到环境变量中。
3)安装完成在命令行输入:python --version,得到如下输出:Python 版本号,表明Python 版本号安装成功。
注释
单行注释
#我是一条单行注释
多行注释
"""
我是一条多行注释
"""
'''
我也是一条多行注释
'''
缩进
python使用缩进来区分代码块,最好是使用4个空格进行悬挂式缩进,并且同一个代码块的语句,要求缩进空格数一致。
数据类型
int(整型):即整数,如123.
float(浮点型):即小数,如3.14。
str(字符型):即字符,如abcd。
bool(布尔型):即False和True。
tuple(元组)
不可变,可重复的,有序的,只读的(没有增删改查)list(列表)
可变的,可重复的,有序的 ,线性的
dict(字典)
可变的,无序的,key值不重复
字典是key:value键值对的数据集合
set(集合)
可变的,无序的,不可重复的
complex(复数)
数据取值范围:无限制
变量与标识符
1. 必须是由字母 数字 下划线三个元素组成
2. 数字不能开头
3. 不能是关键字33
4. 大小写敏感
5. 见名知意
6. 驼峰或下划线区分单词
运算符
1.算数运算符:+ - * / % ** //
结果:数字
2.比较运算符:> >= < <= != ==
结果:bool
3.逻辑运算符:and(并且) or(或者) not(非)
结果:bool
4.赋值运算符:+= -= *= /= %= **= //= =
結果:赋值等式
5.成员运算符:in not in
结果:bool
6.身份运算符:is is not
结果:bool
分支语句if…elif…else…
从上往下依次对if和elif后的表达式进行判断,当某个表达式为True时执行对应的代码块并结束分支语句,如果所有表达式全为False执行else下的代码块并结束分支语句。
if 表达式1:
代码块1
elif 表达式2:
代码块2
...
elif 表达式n:
代码块n
else:
代码块
循环语句for
从容器或range函数中规律且有序的取出数据并存入到变量中,而后依次执行相同的循环体
for 变量 in 容器/range(起始值,终止值,步长):
此同级缩进下皆为循环体
brake #跳出整个循环
continue #跳过当前循环体
注意:终止值取不到
循环语句while
对表达式进行判断,当表达式为True时执行循环体,直到表达式为False,循环体需要加入可以使表达式变为False或brake,否则将会出现死循环。
while 表达式/True:
此同级缩进下皆为循环体
brake #跳出整个循环
continue #跳过当前循环体
字符串
字符串是一种表示文本的数据类型,无法修改内容,表示方式有如下几种情况:
1、文本内容中不包含英文单引号的情况
a = '文本内容'
2、文本内容中不包含英文双引号的情况
a = "文本内容"
3、绝大多数情况
a = '''文本内容'''
or
a = """文本内容"""
索引
字符串里的字符可以通过索引进行访问,索引的下标从0开始。
如果
a = "1b3"
那么
a[0] = 1
a[1] = b
a[2] = 3
切片[::]
通过索引可以实现对字符串字符的截取。
[起始索引:结束索引:步长]
内置函数
通过字符串类型数据.函数名()的形式调用的函数,可以实现很多对字符串的操作。
对标字符串还有一下几种相似数据类型
元组:tuple
1,定义:()
当只有一个元素的时候,元素后加","
2,索引(下标)
3,不允许被修改
4,切片
5,内置函数 sum sorted
6,操作
7,遍历
列表:list
1,定义:[]
2,索引(下标)
3,允许被修改
4,切片
5,内置函数 sum sorted
6,操作 排序(冒泡排序,选择排序,插入排序,基数排序,快速排序,希尔排序,归并排序,堆排序(大根堆和小根堆)) copy
7,遍历
字典
1,定义: key -- value
2,没有下标,可以使用键来获取值 d["age"]
3,value允许被修改
4,没有切片
5,内置函数 len type max min sorted
6,操作
7,遍历
集合
1,定义: {}
2,没有下标
3,value允许被修改
4,没有切片
5,内置函数 len() type max min sorted sum
6,操作
7,遍历
函数与方法-def
python里有函数和方法的区别,最直接的甄别手段就是看关键字def是否写在class里面,写在class里的称之为方法,除此以外的def称之为函数。
def 函数名():
函数体
class 类名():
def 方法名():
方法体
类与对象-class
class用于创建类,类的实例化称之为对象,类可以继承其他类的非私有属性和方法,届时被继承的其他类称之为该类的父类,该类称之为子类。
class 类名(父类名1,父类名2,...,父类名n):
def 方法名():
方法体
一个类可以有多个父类,当父类之间拥有相同的属性或方法时,会优先实现第一次出现的属性或方法,object是所有类的父类。
class A():
a = 123
# def aaa(self, b=a):
# return b
class B():
a = 321
def aaa(self, b=a):
return b
class V(A, B):
pass
v = V()
print(v.a) # 输出结果123 /因为第一次a属性出现是在A类
print(v.aaa()) # 输出结果321 /因为第一次aaa方法出现是在B类
课堂笔记:
面向对象特性
继承,封装,多态
继承:减少代码量,少些重复代码
1,基本概念:父类/超类/基类 子类
2,子类会继承父类中得属性和init
3,子类中可以有子类特有得方法
4,在继承多个父类时,子类继承第一个父类属性,继承所有类得方法;若父类中有相同方法,子类中以第一父类为主
类之间得关系:继承 > 关联-一个类是另一个类得属性 > 依赖-一个类是另一个类方法得参数 (高内聚,低耦合)
object:所有类得父类
__eq__:可以比较两个对象是否相等,默认比较地址,重写后可以按照值进行比较
__hash__:
封装:属性私有化
1,若不想在类外面直接调用属性或方法,那么属性或方法名需要加"__"
多态:多种形态
作业:ATM取款机
# '''
# ATM取款机
# 1,登录(超过三次锁卡) 2,取款 3,存款 4,转账(跨行,手续费 0.002) 5,查询余额
# {["123456789","123",1500,"建设银行",1],[]}
# '''
ATM_data = [["张三", "zs123", [1500, "农业银行"], 3], # 创建一个ATM用户集
["李四", "ls123", [2000, "工商银行"], 3],
["王五", "ww123", [1000, "建设银行"], 3]]
def print_menu(name): # 打印登陆菜单列表 传入参用户名 无返回值
print("-" * 30)
print(f"操作用户:{name}".center(26, "-"))
print("-" * 30)
print("|1.取款|".center(26))
print("|2.存款|".center(26))
print("|3.转账|".center(26))
print("|4.查询|".center(26))
print("|0.退出|".center(26))
print("-" * 30)
def withdrawMoney(user): # 取款函数 传入参数个人用户集 无返回值
money = int(input("请输入取款金额:")) # 定义一个变量money用来接收从控制台输入的取款金额
if money <= user[2][0]: # 判断money的值是否小于等于账户余额
user[2][0] -= money # True:扣除余额
print("取款成功") # 并提示用户
inquiry(user) # 调用查询函数
else:
print("余额不足,取款失败。") # False:继续操作
input("按任意键继续".center(26, "-")) # 并提示用户
def deposit(user): # 存款函数 传入参数个人用户集 无返回值
money = int(input("请输入存款金额:")) # 定义一个变量money用来接收从控制台输入的存款金额
user[2][0] += money # 对个人用户集数据进行修改
print("存款成功") # 提示用户
inquiry(user) # 调用查询函数
def transfer(user): # 转账函数 传入参数个人用户集 无返回值
money = int(input("请输入转账金额:")) # 定义一个变量money用来接收从控制台输入的转账金额
deposit_user = input("请输入转账目标用户名:") # 定义一个变量deposit_user用来接收从控制台输入的转账目标用户名
user_deposit = [] # 定义一个全局变量user_deposit用来存储转账目标个人用户集
flag_name = False # 保存循环中对用户名是否存在的判断
flag_bank = False # 保存循环中对用户银行是否一致的判断
# 通过循环获取相关信息
for i in ATM_data: # 使用变量i零时存储循环遍历的ATM用户集数据
user_deposit = i # 将当前遍历的零时用户集数据存储到全局变量user_deposit
if deposit_user == i[0]: # 判断控制台输入的用户名是否与用户集数据匹配
flag_name = True # True:标记匹配成功
if i[2][1] == user[2][1]: # 判断是否为同一银行用户
flag_bank = True # 同一银行
else:
pass # 什么也不做
else:
pass # 什么也不做
# 使用相关信息对用户数据进行操作
if flag_name: # 用户名存在时
if flag_bank: # 用户是同一家银行时
if money <= user[2][0]: # 转账金额小于等于存款金额时
user[2][0] -= money # 扣除转账金额
user_deposit[2][0] += money # 为目标用户存入对应金额
print("转账成功") # 提示转账成功
inquiry(user) # 调用查询函数
else:
print("余额不足,转账失败。") # 提示用户
input("按任意键继续".center(26, "-"))
else:
quit_confirm = input(f"跨行转账需要收取您{money * 0.002}({money}*0.002)的手续费,是否继续?(Y or N):") # 提示跨行并让用户从控制台输入是否继续
if quit_confirm == "Y" or quit_confirm == "y": # 用户同意时
if money * 1.002 <= user[2][0]: # 转账金额算上手续费小于等于存款金额时
user[2][0] -= money * 1.002 # 扣除转账金额
user_deposit[2][0] += money # 为目标用户存入对应金额
print("转账成功") # 提示转账成功
inquiry(user) # 调用查询函数
else:
print("余额不足,转账失败。") # 提示转账失败
input("按任意键继续".center(26, "-"))
else:
print("转账已取消。") # 提示转账取消
input("按任意键继续".center(26, "-"))
else:
print("用户不存在") # 提示用户不存在
def inquiry(user): # 查询函数 传入参数个人用户集 无返回值
print(f"当前用户余额为:{user[2][0]}")
input("按任意键继续".center(26, "-"))
def pass_ATM(user): # 核心功能函数 传入参数个人用户集 无返回值
while True: # 永真循环
print_menu(user[0]) # 打印功能列表
key = input("请输入功能对应的数字:") # 控制台输入功能序号
if key == '1': # 序号为1时
withdrawMoney(user) # 执行 取款 操作
elif key == '2': # 序号为2时
deposit(user) # 执行 存款 操作
elif key == '3': # 序号为3时
transfer(user) # 执行 转账 操作
elif key == '4': # 序号为4时
inquiry(user) # 执行 查询 操作
elif key == '0': # 序号为0时
quit_confirm = input("亲!确认退出么?(Y or N):") # 从控制台接收判断值
if quit_confirm == "Y" or quit_confirm == "y": # 退出
print(f"已退出用户{user[0]}") # 提示用户
input("按任意键继续".center(26, "-"))
break # 结束循环
else:
input("按任意键继续".center(26, "-"))
else:
print("指令不存在,请重新输入!") # 提示指令输入错误
def main(): # 主函数
print("欢迎使用ATM自助银行")
while True: # 永真循环
print("1.登陆")
print("0.退出")
key = input("请输入操作指令:") # 从控制台接收判断值
if key == '1': # 登陆用户
username = input("读取用户名:") ## 从控制台接收用户名
flag = False # 用来存储 判断用户数据是否可以操作 的状态
for i in ATM_data: # 遍历ATM用户数据集
if username == i[0] and i[-1] > 0: # 密码正确并且可输入次数大于0
flag = True
for j in range(i[-1]): # 使用用户数据中可输入密码次数作为循环判读密码是否正确的循环次数
password = input("请输入密码:") # 从控制台接收密码
if i[1] == password: # 密码正确
i[-1] = 3 # 重置可输入密码次数
pass_ATM(i) ############################调用核心功能函数
break # 跳出判断密码循环
else:
print("密码错误!") # 提示用户密码错误
i[-1] -= 1 # 可输入密码次数-1
if i[-1] == 0: # 当可输入密码次数等于0时
print(f"{i[0]}用户已被冻结!") # 提示用户被冻结
data = input("是否继续?(Y or N)") # 提示用户密码错误是否继续操作?
if data == "y" or data == "Y": # 继续密码判断循环
pass # 继续循环密码判断
else:
break # 跳出密码判断循环
break # 跳出ATM用户数据集的循环遍历,减少不必要的判断。
else:
pass # 继续遍历ATM用户数据集循环
if flag: # 为了不在遍历ATM用户数据集循环中打印不要的提示信息
pass # 继续永真循环
else:
print("用户不存在!或被冻结。") # 用户不满足操作条件时给出的提示
input("按任意键继续".center(26, "-"))
elif key == '0': # 退出ATM
confirmExit = input("确认退出吗?(Y or N)") # 接收用户指令
if confirmExit == "Y" or confirmExit == "y":
print("退出成功,请取走您的卡片!") # 提示用户退出成功
break # 结束永真循环
else:
input("按任意键继续".center(26, "-")) # 继续永真循环
else:
print("指令不存在,请重新输入!") # 提示指令输入错误
main() # 调用主函数
异常
有点类似if-else,只不过判断的条件从表达式,变成程序是否可以正常执行。except可以指定异常名字,用于针对性的捕获异常,不指定则所有异常都可以触发捕获机制。
try:
可能出现异常的代码块/尝试执行的代码
except 异常名 as 简称/捕获容器:
出现异常时执行的代码/捕获异常时执行的代码
else:
除指定异常以外的其他异常
finall:
不论是否出现异常都执行的代码
try:
lt.remove(value)
except ValueError as ve:
print("友好提示/对错误信信息得处理")
except ZeroDivisionError as e:
print("友好提示/对错误信信息得处理")
else:
print("友好提示/对错误信信息得处理")
finally:
self.t = tuple(lt)