循环结构
- 根据条件或指定次数反复执行某个动作(语句)
- while
while 条件:
满足条件执行的语句
break # 终止循环
else:
不满足条件执行的语句
while True:
语句段
例:
"""
使用下列代码循环,直到录入"exit"后退出
在控制台中获取一个季度,打印相应的月份
输入与输出:
春 1月2月3月
夏 4月5月6月
秋 7月8月9月
冬 10月11月12月
"""
while Ture:
season = input("获取一个季度")
if season=="春":
print('1月2月3月')
elif season=="夏":
print('4月5月6月')
elif season=="秋":
print('7月8月9月')
elif season=="冬":
print('10月11月12月')
if input("请输入exit退出") == 'exit':
break #退出循环
while循环结构的三要素
- 循环变量初始值
- 循环条件
- 循环变量增值
语法及练习
#运行结果变成横着
print(i,end=',')
i = 1 #循环变量初值
while i < 5: #i<5表示循环条件
print("你好")
i = i+1 #循环变量增值
在终端中显示0 1 2 3 4 5
i = 0
while i < 6:
print(i)
i +=1
在终端中显示2 3 4 5 6 7
i = 2
while i < 8:
print(i)
i +=1
在终端中显示0 2 4 6
i = 0
while i < 8:
print(i)
i +=2
在终端中显示4 3 2 1 0
i = 4
while i >=0:
print(i)
i -=1
在终端中显示-1 -2 -3 -4
i = -1
while i >= -4:
print(i)
i -=1
求1-9的平方
i = 1
while i <= 9:
sum = (i * i)
或者 sum = (i ** 2)
print(sum,end=' ')
i += 1
输出列表中的元素 a = [23,24,21,22,23,25,22]
list = [23,24,21,22,23,25,22]
i = 0
while i<=6:
print(list[i],end=' ')
i+=1
for循环
- 用于遍历可迭代对象的元素
for 变量 in 可迭代对象:
语句1
break #跳出循环
else:
语句2
message = "我是齐天大圣孙悟空"
for item in message:
print(item)
"""
在终端中获取任意整数,累加每位数字
输入:"12345"
输出:15
"""
num = input("请输入数字")
value = 0
for num1 in num:
value += int(num1)
print(value)
for 循环计数
range(开始,结束,间隔) --整数生成器
开始值默认为0
不包含结束
间隔默认为1
for item in range(10):
print(item,end=' ')
例:循环累加下列数字的和:0 1 2 3 4 5
value = 0
for item in range(6):
value += int(item)
print(value)
#循环累加下列数字的和:2 3 4 5 6 7
value = 0
for item in range(2,8):
value += int(item)
print(value)
#循环累加下列数字的和:0 2 4 6
value = 0
for item in range(0,7,2):
value += int(item)
print(value)
#循环累加下列数字的和:4 3 2 1 0
value = 0
for item in range(4,-1,-1):
value += int(item)
print(value)
#循环累加下列数字的和:-1 -2 -3 -4
value = 0
for item in range(-1,-5,-1):
value += int(item)
print(value)
例:累加1-50,且能被5整除的和
value = 0
for item in range(1,51,1):
if item % 5 == 0:
value += item
print(value)
#累加10~~50之间个位不是2,5,9的整数
value = 0
for item in range(10,51,1):
unit = item % 10
if unit % 2 == 0 or unit % 5 == 0 or unit % 9 ==0:
continue #跳过
value += item
print(value)
continue
- 表示结束本次循环,继续下次循环,一般用在if语句中
案例:壮士吃包子问题,当吃到第999个包子,发现半只虫子,后不吃第999个包子,继续吃第1000个...
for i in range(1,10001,1):
if i == 999:
print("发现半只虫子")
continue
print(f'壮士吃第{i}个包子')
i = 0
while i <= 9999:
i = i + 1
if i == 999:
print("发现半只虫子")
continue
print(f'壮士吃第{i}个包子')
例:获取键盘输入的数据,判断输入的数据中有几个字母、几个数字、几个空格
s = input("请输入你的数据:")
print("您输入的数据是:",s)
zm = 0 #表示字母,用于计数
sz = 0 #表示数字,用于计数
kg = 0 #表示空格,用于计数
for str in s:
if str.isalpha():
zm +=1
elif str.isdigit():
sz +=1
elif str.isspace():
kg +=1
print("字母的数量:",zm)
print("数字的数量:",sz)
print("空格的数量:",kg)
else语句
- 表示循环结束后,执行的语句
break语句
- 终止循环(退出循环),即提前结束循环
#方法二
i = 1
while i <= 101:
print("跑第",i,"圈")
i = i + 1
if i == 40:
break
嵌套循环
语法:
for i in 迭代对象:
for j in 迭代对象:
语句段
a = [[1,2,3],[4,5,6]]
for i in a:#i表示获取的每一个小列表,外循环
for j in i:#j表示获取每一个具体数据,内循环
print(j,end=' ')
print(i)
外行内列
"""使用for循环绘制以下图形
*****
#####
*****
#####
"""
for r in range(4): #外循环控制行
for c in range(5): #内循环控制列
if r % 2 ==0:
print("*",end=" ")
else:
print("#",end=" ")
print()
例:使用双层for输出直角三角形
for r in range(4): #外循环控制行
for c in range(r+1): #内循环控制列
print("-",end=" ")
print()
例:输出九九乘法表
for r in range(1,10): #外循环控制行
for l in range(1,r+1): #内循环控制列
print(f"{r}*{l} = {r*l}",end=" ")
print()
异常处理和错误
- 表示程序运行期间发生的错误,比如文件打不开,文件不存在,磁盘满、数据库连不上等
- 一般使用if语句难以处理这种判断
- python提供异常处理
except IndexError:
print('下标越界')
except KeyError:
print('字典键不存在')
except BaseException as e:
print('其他错误'+str(e))
IndexError 下标索引超出序列边界
IOError 输入/输出异常,基本上是无法打开文件
TypeError 传入对象类型与要求的不符合
KeyError 试图访问字典里不存在的键
try:
可能出现错误的代码
except 异常类名1 as 别名:
异常处理代码段1
except 异常类名2 as 别名:
异常处理代码段2
except 异常类名3 as 别名:
异常处理代码段3
finally:
不论是否发生异常都会执行的代码
try 部分如果没有出错,则except代码不执行
number01 = int(input("请输入整数01"))
number02 = int(input("请输入整数02"))
#0不能做除数,也就是不能做分母
try:
print(number01 / number02)
except Exception as e:
print(f"出错了,出错信息是{e}")
#下标越界
a = [23,23,11,15,16,48,15]
try:
i = 1
while i <= 7:
print(a[i],end='')
i +=1
except IndexError:
print('下标越界')
#请大家制作两个整数加法计算器,可以一直执行
try:
number01 = int(input("请输入整数01"))
number02 = int(input("请输入整数02"))
result = number02+number01
print(f"{number01}+{number02}={result}")
except ValueError:
print("只能输入整数类型数据")
#什么时候都执行的语句
finally:
print("请重新启动程序")
函数
- 函数是对一系列有关联的代码进行封装
- 函数分为
- 内置函数
- 标准库函数OS、sys、random、math等
- 第三方函数库pandas、pymysql、requests
- 自定义函数
定义函数
def 函数名(参数列表):
函数体
return 返回值
# 定义无参无返回值函数
def add():
x = float(input('请输入第1个数:'))
y = float(input('请输入第2个数:'))
print(f'{x} + {y} = { x + y}')
# 定义有参无返回值函数
def sub(x, y):
z = x - y
print(f'{x} - {y} = { z }')
# 定义无参有返回值函数
def mul():
x = float(input('请输入第1个数:'))
y = float(input('请输入第2个数:'))
z = x * y
return z
# 定义有参有返回值函数
def div(x,y):
z = x / y
return z
"""
定义函数,判断列表中是否存在相同元素
输入:[3,4,6,8,6]
输出:True
"""
def a(list):
for r in range(len(list)-1):
for c in range(r+1,len(list)):
if list[r] == list[c]:
return True
return False
list01 = [3,4,6,8,6]
print(a(list01))
调用函数
def user_login(u,p):
if "admin" == u and "123456" == p:
print("登录成功")
else:
print("登陆失败")
#获取键盘输入的用户名和密码
username = input("请输入用户名")
passwd = input("请输入密码")
#调用函数
user_login(username,passwd)
例:定义一个处理姓名函数,要求首字母大写,调用函数,实现功能
def change_name(name):
# 获取实参的值,并转换成大写显示,并使用new_name存储
new_name = name[0].upper() + name[1:].lower()
print(f'您的姓名是:{new_name}')
# 调用函数
change_name('simTH')
#运行结果
您的姓名是:Simth
函数参数
def 函数名(a,b):
#a,b是必须参数,必须参数与定义函数有关
函数体
函数名(实参1,实参2)
#位置参数/必须参数 与调用函数有关
#按位置传参
def add(a,b):
print(f"a是:{a}")
print(f"b是:{b}")
result = a + b
print(f"两数之和是:{result}")
add(5,9)
#默认值 带有默认值参数必须放在最后面
def 函数名(a,b,c=默认值):
函数体
函数名(实参1,实参2)
函数名(实参1,实参2,实参3)
#关键字参数
函数名(a=实参1,b=实参2,c=实参3)
函数名(a=实参1,c=实参3,b=实参2)
函数名(实参1,c=实参3,b=实参2)
#可变数量参数/变参
def 函数名(a,b,*c):#a,b是必须参数,c是变参
函数体
函数名(实参1,实参2) #c = () 空元组
函数名(实参1,实参2,实参3,实参4,实参5) #c = (实参3,实参4,实参5)
print('hello'*3) #表示复制
print(25 * 100) #表示乘法运算
print(*[1,2,3,4,5])#拆列表/元组/集合
def add(a,b):
print(a)
print(b)
c = {'a':12,'b':15}
add(**c) #使用**将字典拆分后,与形参进行对应
def add(**c):
print(c)
c = {'a':12,'b':15}
add(**c)
匿名函数
变量 = lambda 形参列表:表达式
#lambda 用于声明匿名函数
#形参列表与定义函数形参列表一样,多个参数使用逗号分隔
#表达式:是函数要返回值的表达式,只允许是一个
res01 = lambda a,b,c:print("三个数相加之和是:",a+b+c)
res01(10,20,30)
装饰器
- 装饰器本质就是一个函数
- 为已存在的函数,添加额外的功能
- 不需要对函数对象,做任何代码变动
#装饰器1
def 装饰器名称(func):
def 内部函数(参数):
函数体
func()
return 内部名函数
@装饰器名称
def func1(s):
函数代码
func1(实参)
#装饰器2
def decorate(func):
print("python程序设计")
func()
print("www.tomooc.cn")
return "装饰器的返回值"
@decorate
def func1():
print("这是func1函数")
print(func1)
#装饰器3
def decorate():
def inner(func):
print("内部函数-1")
func()
print("内部函数-2")
return inner
@decorate()
def func1():
print("这是func1函数")
print(func1)
#编写一个装饰器,实现字符串首字母大写,其他小写
def change(func):
def inner(s):
s = s[0].upper() + s[1:].lower()
func(s)
return inner
@change
def test(a):
print(a)
test("python")
类和对象
定义类
class 类名(父类名):
def 函数名(self,参数列表):
函数体
return 返回值
- self代表类自身,用于定义和调用类中的实例变量(数据成员)
class Person:
def show(self):
# self 表示类本身
print("这是一个show函数")
def eat(self, a, b): #a,b表示形参列表
#数据成员(实例变量)
self.name = a #self.实例变量 = 值
self.food = b
print(f"{self.name}正在吃{self.food}")
类的实例化
#实例化名 = 类名(参数列表)
per = Person() #类的实例化
#访问类中的函数
per.show()
per.eat("张三","蛋炒饭")
访问类中的变量
per.name = "李四"
per.food = "烤冷面"
print(f"{per.name}正在吃{per.food}")
构造函数(注意:前后分别为两个下划线)
- 在定义类中,可以定义一个构造函数,用于类实例化时初始化相关数据
def __init__(self,形参列表)
函数体
- 构造函数名称必须为init
- self不能省略
- 如果构造函数定义时有参数列表,实例化类时必须要提供
- 构造函数中不能有return
class Student:
def __init__(self,i,n,a,s,c):
self.id = i
self.name = n
self.age = a
self.score= a
self.sclass = c
print("构造函数正在初始化数据")
def show(self):
print(f"{self.sclass}的,{self.name},今年{self.age}岁")
def study(self,b):
self.book = b
print(f"{self.name}正在看{self.book}")
def play_game(self,g): # a,b 表示形参列表
# 数据成员(实例变量)
self.game = g
print(f"{self.sclass}的,{self.name},今年{self.game}岁")
stu = Student(100,"张三",18,90.5,"三年二班")
stu.show()
stu.study("<<狂人日记>>")
stu.play_game("羊了个羊")
score = stu.get_score()
print(f'{stu.name}的分数是:{score}')
继承
class 父类(父类名):
def 函数名(self,参数列表):
函数体
return 返回值
class 父类:
....
class 子类(父类): #继承
....
例:定义2个类,实现类的继承,对子类进行实例化,使用类,输出结果
class Shape:
def input_data1(self,c,k):
self.c = c
self.k = k
print(f'您输入的长是:{self.c},宽是:{self.k}')
def nj1(self):
self.mj1 = self.c * self.k
print(f'长方形面积是:{self.mj1}')
#定义子类
class Yuan(Shape):
# 自定义函数
def input_data2(self):
self.r = float(input("请输入圆的半径(R):"))
print(f'您输入的半径是:{self.r}')
def mj2(self):
self.mj2 = 3.14 * self.r * self.r
print(f'圆的面积是:{self.mj2}')
模块
- 模块就是颇有通红源文件,以.py结尾的文件,成为模块
- 模块中含有变量、函数、类、流程控制语句
11111111
#加法函数、减法函数、变量=3.14,列表为城市列表['北京','上海','广州']
PI = 3.14
city = ['北京','上海','广州']
def add(x,y):
z = x+y
print(z)
def sub(x,y):
z = x - y
print(z)
if __name__ == '__main__':
#__name__变量是__main__时说明该模块现在正在单独被运行
add(100,200)
sub(100,200)
print("圆周率:",PI)
222222222
#包含一个名为Calc的类,包含乘法函数mul和惩罚函数div
#普通变量 =999
#普通变量 ='hello'
n1 = 999
s1 = "Hello"
class Calc:
def mul(self,x,y):
z = x * y
return z
def div(self,x,y):
if y != 0:
z = x/y
return z
else:
print("除数为0")
if __name__ == '__main__':
t1 = Calc()
a = t1.mul(3,4)
print(a)
导入模块
import 模块名1,模块名2
import 模块名 as 别名
#成员名可以是函数、类、变量
from 模块名 import 成员名
#使用模块中的成员
模块名.变量名
模块名.函数名()
#如果有return情况
返回值变量 = 模块名.函数名(实参1,实参2)
对象名 = 模块名.类名()
包
import 包名.子包名.模块名1,包名.子包名.模块名2
import 包名.子包名.模块名 as 别名
|-----config # 存放配置文件
|-----log # 存放日志文件
|-----util # 存放工具文件
|-----script # 存放测试代码
|----- data # 存放测试数据
例:创建1个包,包名是script,子包名是dev,包中包含的模块有mod4
# 定义常量
PI = 3.14
# 定义函数
def mod4_func1():
print("这个是mod4中的函数")
# 定义类
class Mod4:
def mod4_func2(self):
print("这个是Mod4中的函数")
# 代码测试
if __name__ == '__main__':
print(PI)
mod4_func1()
c4 = Mod4()
c4.mod4_func2()
例:创建1个包,包名是script,子包名是qa,包中包含的模块有mod5
# 定义元组
city = ("北京", "上海", "广州")
# 定义函数
def mod5_func1(str1):
str1 = "您好"+str1
return str1
# 定义类
class Mod5:
def mod5_func2(self,str2):
self.str2 = "Hello"+str2
print("这个是mod5中的函数")
return self.str2
# 测试代码
if __name__ == '__main__':
x = mod5_func1("Python")
print(x)
c5 = Mod5()
y = c5.mod5_func2("Word")
print(y)
文件夹及文件操作
文件的操作:打开、读写、关闭
#打开文件
文件对象 = open("文件名","访问方式")
a 追加:如果文件不存在则新建文件,写入时在原有内容基础上追加新内容
r 只读:如果文件不存在报错,不支持写
W 写入:如果文件不存在则新建文件,写入时覆盖原有内容
如果不写访问方式时,默认为只读
b 访问模式特点,表示二进制
result = open('test','rb+')
print(result)
#读取文件
print(result.read())
#关闭文件
result.close()
time模块
import time
# 获取当前系统时间戳
cur_time = time.time()
print(f'当前系统时间戳:{cur_time}')
# 获取当前系统时间
cur_time_01 = time.localtime(time.time())
print(f'当前系统时间是:{cur_time_01}')
# 获取当前系统格式化的时间
cur_time_02 = time.asctime(time.localtime(time.time()))
print(f'当前系统格式化的时间是:{cur_time_02}')
# 按照某个日期格式,格式化时间 2023-02-23 16:13:34
cur_time_03 = time.strftime('%Y/%m/%d %H:%M:%S',time.localtime())
print(f'按照设置好的日期时间格式显示:{cur_time_03}')
os模块
#os模块 --操作文件和文件夹
import os #导入模块
os.函数名() 使用os模块中的相关功能
#文件和文件夹的重命名
os.rename('test','Demo')
#删除文件
os.remove('Demo')
# 创建文件夹
os.mkdir("test")
#删除文件夹
os.rmdir("test")
# 查看当前所在工作路径
print(os.getcwd())
# 切换目录
os.chdir("test")
print(os.getcwd())
# 查询当前目录下有那些目录
print(os.listdir())#返回当前目录
pymysql模块
import pymysql
conn = pymysql.connect(host='数据库服务器ip地址',
user='数据库用户名',
password='数据库密码',
database='数据库名',
port='数据库端口号'
)
# 获取游标对象,操作数据库
cursor = conn.cursor()
# 执行sql数据,返回内容为实际操作数据的行数
cursor.execute('SQL语句') # 按行执行
# 获得结果或
result = cursor.fetchone()
result = cursor.fetchall()
# 提交事务
conn.commit()
# 回滚事务
conn.rollback()
# 关闭数据库
conn.close()
Excel操作
import pandas,openpyxl
# 先读取excel 数据到内存
# 默认读取excel表中的第一个sheet表
data = pandas.read_excel("excel文件.xlsx")
print(data)
# 将内容转为列表
data = data.values.tolist()
print(data)
# 读取excel文件中第二个sheet
# data = pandas.read_excel("excel文件.xlsx",sheet_name=1)
# 打开excel 表
xlsfile = openpyxl.load_workbook('excel文件.xlsx')
# 指定sheet表
sheet = xlsfile['Sheet1']
# 增加sheet表
sheet.create_sheet("工作表名")
# 增加行
sheet.append("列表数据") # 列表中数据与列名一一对应
# 删除行
sheet.delete_rows("删除第几行") # 行数从1开始
# 保存文件
xlsfile.save("excel文件.xlsx")