目录
Python流程控制语句
1.if语句
2.if-else语句
3.if-elif-else语句
Python练习
Python数据类型
1.序列
2.列表
3.切片
列表中的增删改查:
列表通用方法:
实验练习
range函数
对多层循环的处理
元组Tuple
序列的比较
字典
删除:
遍历:
字典的实际运用:
字符串:
集合:
集合的运算:
Python流程控制语句
1.if语句
语法结构:
if 条件表达式: # 用冒号代表语句块开始
代码块 # 缩进非常重要
a = 10if a > 10:print('大于10')print('hello')
input()name = input('请输入您的姓名')print(type(name),name)所有输入的内容都是当作字符串
2.if-else语句
if 条件表达式 :
代码块
else :
代码块
3.if-elif-else语句
if 条件表达式 :
代码块
elif 条件表达式 :
代码块
elif 条件表达式 :
代码块
elif 条件表达式 :
代码块
else :
代码块
Python练习
1. 输入一个数,判断是否是水仙花数
num=int(input())if num < 100 or num > 999:print('请输入一个三位数')else:a = num//100b = num%10c = num//10%10if a**3+b**3+c**3 == num:print(num,'是水仙花数')else:print(num,'不是水仙花数')
2.输入年月日,判断这天是这一年的第几天
year = int(input('请输入年'))month = int(input('请输入月'))day = int(input('请输入日'))isLeapYear = True if (year%4==0 and year%100!=0) or year%400==0 else Falsesum = 0if month == 12:sum += 30month-=1if month == 11:sum += 31month-=1if month == 10:sum+=30month-=1if month == 9:sum+=31month-=1if month == 8:sum+=31month-=1if month == 7:sum+=30month-=1if month == 6:sum+=31month-=1if month == 5:sum+=30month-=1if month == 4:sum+=31month-=1if month == 3:if isLeapYear:sum+=29else:sum+=28month-=1if month == 2:sum+=31month-=1sum+=dayprint(sum)#或者import datetimeimport calendaryear=int(input('请输入4位数字的年份:'))#获取年份month=int(input('请输入月份1到12之间:'))#获取输入月份day=int(input('请输入日份1到31之间:'))#获取日份targetDay=datetime.date(year,month,day) # 将输入的日期专格式化成标准的日期dayCount=targetDay-datetime.date(targetDay.year-1,12,31)#减去上一年最后一天print('%s是%s年的第%s天。'%(targetDay,year,dayCount.days))
3.BMI 体重和身高换算
计算公式为:BMI=体重(kg)/ 身高(m)²,体重正常:18.5-24.9,超重:25-29.9,一级肥胖:30-34.9
输入身高和体重,输出指数和健康情况判断
#BMI=体重/(身高x身高)h=float(input("请输入你的身高(例如1.60m):"))w=float(input("请输入你的体重(kg):"))BMI=w/h**2if BMI>35:print("重度肥胖")elif BMI>=30:print("一级肥胖")elif BMI>=25:print("超重")elif BMI>=18.5:print("体重正常")else:print("偏瘦")
4.我家的狗5岁了,5岁的狗相当于人类多大呢?其实,狗的前两年每
一年相当于人类的10.5岁,之后每增加一年就增加四岁。那么5岁的狗
相当于人类多少年龄呢?应该是:10.5+10.5+4+4+4=33岁。
编写一个程序,获取用户输入的狗的年龄,通过程序显示其相当于人
类的年龄。如果用户输入负数,请显示一个提示信息。
old=int(input("请输入小狗的年纪:"))if old<0:#如果输入的数为负数print("请输入正确的年龄")elif old<=2:people=old*10.5print("小狗相当于人类年龄为:",people)else:people=2*10.5+(old-2)*4print("小狗相当于人类的年龄为:%s"%people)
5. 编写一个程序,从4个整数中找出最小的数,并显示此数。
#先输入四个数a=int(input("请输入a:"))b=int(input("请输入b:"))c=int(input("请输入c:"))d=int(input("请输入d:"))min=aif min>b:min=bif min>c:min=cif min>d:min=dprint(f'{a},{b},{c},{d}四个数中最小的数为{min}')
Python数据类型
1.序列
序列是python中最基本的一种数据结构,数据结构是指数据存储的方式
序列是保存一组有序的数据,所有的数据在序列中都有一个唯一的(位置)索引
序列中的有序,指的是数据放入的顺序有序
序列分类:
1)可变序列——列表list
2)不可变序列——字符串str 元组tuple
2.列表
python中的一个对象
列表用来保存多个有序的数据,列表是用来存储对象的对象
列表(List)是Python中使用最多的数据类型,在其他语言中通常叫数组
Python中的列表比其他语言中的数组功能要强劲的多
创建列表:
使用[]创建列表,用,分割元素
列表中可以保存任意类型的元素
可以通过索引访问列表中的元素,索引从0开始,超出范围IndexError:list index out of range
使用len()函数可以获得列表元素的个数
arr=[]#创建空列表arr=[1,2,3,4,5]#创建列表时指定元素print(arr,type(arr))#列表中可以保存任意类型的元素arr=[1,'Hello',True,None,[1,2,3],print]print(arr)
列表强大的地方
1.可以使用负数来获取元素,-1代表最后一个元素,-2代表倒数第二个元素
print(arr[-1])
2.支持更多的运算符
3.支持切片
#遍历列表i=0while i<len(arr):print(arr[i])i+=1#使用负数索引遍历i=-1while i>=-len(arr):print(arr[i])i-=1#使用for循环遍历for i in arr:print(i)
列表拼接:
使用+可以将两个列表拼接为一个列表
使用*可以将列表复制指定次数
arr2=[1,2,3]+[4,5,6]print(arr2)# [1, 2, 3, 4, 5, 6]print(arr2*3)#这里指循环输出三遍arr2# [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
in和not in
in用来检测指定元素是否在列表中,在列表中返回True
not in检测指定元素不在列表中,不在返回True
print(10 in arr2)#Falseprint(10 not in arr2)
3.切片
切片就是在现有列表的基础上,获取一个子列表
做切片的时候总是返回一个新的列表,不会影响原有的列表
列表[起始:结束:步长]
起始包含在子列表中,但是结束不包含在新列表中
起始,结束,步长都可以缺省
起始缺省就是从头开始切
结束缺省就是一直切到最后一个元素
步长默认是1
#由上面可知 arr2=[1,2,3,4,5,6]arr3 = arr2[:]#取[1,2,3,4,5,6]print(arr3)print(id(arr2),id(arr3))print(arr2 == arr3)#因为相等所以返回true#arr2=[1,2,3,4,5,6]print(arr2[2:])#取数范围不包括前两个# [3, 4, 5, 6]print(arr2[:3]) # 不包含第三个# [1, 2, 3] print(arr2[::2])#每隔两个数取一个 从初始位置开始# [1, 3, 5]print(arr2[1::2])#从第二个数开始每隔两个数取一个# [2, 4, 6]print(arr2[::-1]) 步长可以为负数,代表倒过来取元素,不能取0# [6, 5, 4, 3, 2, 1] #取字符串的操作s = 'abcdefghijk'print(s[0:3])#abc 取3个数print(s[:-3])#abcdefgh 除后三个数不取print(s[::2])#acegik 隔两个数取一个print(s[::-1])#kjihgfedcba 倒着取数
列表中的增删改查:
查看对象的方法和属性使用dir
print(dir(arr2))['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
修改:直接修改索引对应的元素
arr2[2]=23print(arr2)
删除:del
a=10print(a)del aprint(a)#提示:NameError: name 'a' is not definedder arr2[2]print(arr2)
切片修改
arr2 = [1,2,3,4,5,6]arr2[0:2] = [10,20] # 使用10和20替换0和1索引上的元素print(arr2) # [10, 20, 3, 4, 5, 6]arr2[0:2] = [100,200,300] # 新元素替换原来位置的元素,在这是拿3个替换了2个arr2[::2] = [10,30,50] print(arr2) # [10, 2, 30, 4, 50, 6]
切片删除 del
切片修改删除只用可变序列,字符串不可以用切片修改删除的方法
arr2 = [1,2,3,4,5,6]del arr2[0:2](从第0个开始 删除两个)print(arr2) # [3, 4, 5, 6]arr2 = [1,2,3,4,5,6]del arr2[::2](从第一个开始每隔一个删除一个)print(arr2) # [2, 4, 6]arr2 = [1,2,3,4,5,6]arr2[1:4] = [](从第二个开始到第四个全为null)print(arr2) # [1, 5, 6]#删除最后一个元素arr2 = [1,2,3,4,5,6]# del arr2[-1:]# del arr2[len(arr2)-1]# arr2[-1:] = []print(arr2)
列表通用方法:
| 函数 | 功能 | 说明|
| ---- | ------------------ | -------------- |
| len | 获取容器元素个数
| del | 删除变量
| max | 返回容器中的最大值 | 一定是可排序的 |
| min | 返回容器中的最小值 | 一定是可排序的 |
可以使用对象.方法() 方式调用
| 函数 | 功能
| ------ | --------------------------------------------
| index | 找出某个元素在列表中的位置
| append | 在列表的末尾增加元素
| insert | 插入新元素到指定位置,第一个参数是索引
| extend | 将另外一个列表追加到后面
| reomve | 删除列表中的第一个指定元素,如果元素不存在则报错
| clear | 清空
| pop | 默认弹出最后一个元素,也支持索引弹出
| count | 统计列表中元素的个数
| sort | 排序,默认是升序
#index-找出某个元素在列表中的位置arr = ['zhangsan','lisi','wangwu']print(arr.index('lisi')) # 1#append-在列表的末尾增加元素arr.append('chenliu')print(arr) # ['zhangsan', 'lisi', 'wangwu', 'chenliu']#insert-插入新的元素到指定位置arr.insert(1,'tianqi')print(arr) # ['zhangsan', 'tianqi', 'lisi', 'wangwu', 'chenliu']# 一次只能插一个对象arr.insert(1,['tianqi','huba'])print(arr) # ['zhangsan', ['tianqi', 'huba'], 'lisi', 'wangwu']# extend-追加另外一个列表到后面arr2 = [1,2,3]arr.extend(arr2)#追加字符串的时候,实际上是追加一个个字符的列表arr.extends('xu9')# ['zhangsan', 'lisi', 'wangwu', 'x', 'u', '9']#remove-删除列表中的第一个指定元素,如果元素不存在则报错arr = ['zhangsan','lisi','wangwu']arr.remove(1)print(arr)# ValueError: list.remove(x): x not in list#移出lisiarr = ['zhangsan','lisi','wangwu']arr.remove('lisi') print(arr) # ['zhangsan', 'wangwu']#重复则删除靠前的arr = ['zhangsan','lisi','lisi','wangwu']arr.remove('lisi') # 只删除第一个print(arr)# ['zhangsan', 'lisi', 'wangwu']arr = ['zhangsan','lisi','wangwu']print(arr.pop()) # wangwuprint(arr) # ['zhangsan', 'lisi']
实验练习
完成一个学生管理系统(SMS),用列表和循环实现
命令行版本
功能
1. 查询:显示系统中所有学生
2. 添加:将学生添加到系统中
3. 删除:将学生从系统中删除
4. 退出
student_list = {}def menu():print("*" * 30)print("欢迎访问学生管理系统")print("*" * 30)print("********1:添加学生************")print("********2:删除学生************")print("********3:修改学生************")print("********4:显示学生信息********")print("********5:关闭学生管理系统****")print("*" * 30)#增def add_student():#增加学生方法id = input("请输入学生的学号:")name = input("请输入学生的姓名:")sex = input("请输入学生的性别:")phone = input("请输入学生的联系方式:")student_info = {'name': name, 'sex': sex, 'phone': phone}student_list[id] = student_infoprint("添加成功")#删def delete_student():#删除学生方法id = input("请输入要删除的学生学号:")if id not in student_list.keys():print("未找到该学生")delete_student()student_list.pop(id)print("您删除了该学生信息")#改def edit_student():#编辑学生id = input("请输入要修改的学生学号:")if id not in student_list.keys():print("未找到该学生!")returnstudent_info = student_list[id]print("你当前修改学生的学号%s 姓名%s 性别%s 联系方式%s"%(id,student_list[id]['name'],student_list[id]['sex'],student_list[id]['phone']))print("*"*30)print("请输入要修改的内容编号")print("1:姓名")print("2:性别")print("3:联系方式")print("4:全部信息")print("*"*30)edit_news = input("请输入编号:")if edit_news == "1":newname = input("请输入学生的姓名:")student_list[id]['name'] = newnameelif edit_news == "2":newsex = input("请输入学生的性别:")student_list[id]['sex'] = newsexelif edit_news == "3":newphone = input("请输入学生的联系方式:")student_list[id]['phone'] = newphoneelif edit_news == "4":newname = input("请输入新的学生姓名:")newsex = input("请输入学生性别:")newphone = input("请输入学生联系方式:")student_list[id]['name'] = newnamestudent_list[id]['sex'] = newsexstudent_list[id]['phone'] = newphoneprint("修改成功")else:print("输入有误")#查def show_student_list():print("*" * 30)for id, value in student_list.items():print("学号:%s 姓名:%s 性别:%s 联系方式:%s" % (id, value['name'], value['sex'], value['phone']))def main():while True:menu()user_input = input("请输入你要选择操作的数字:")if user_input == "1":add_student()elif user_input == "2":delete_student()elif user_input == "3":edit_student()elif user_input == "4":show_student_list()elif user_input == "5":quit_menu = input("请确认要退出系统吗?(yes or no):")if quit_menu == 'yes':breakelse:print("你的输入有错误")main()
range函数
一个用来生成自然数序列的函数
arr=range(5)#生成随机数范围是(0-4)for i in arr:print(i)print(list(arr))#输出arr#range(start,end,step) range的参数可以有三个,起始位置,结束位置,步长(默认1)arr=range(10,20,4)print(list(arr))#输出[10,14,18] 从10开始每隔4个数取一个直到20
可以通过range()创建一个指定执行次数的for循环
for i in range(1,11):print(i)else:print("end")
对多层循环的处理
1.封装到一个方法内,用return解决
def f():for i in range(1,10):for j in range(1,i+1):if i*j>25:returnprint("%dx%d=%d"%(i,j,i*j),end='')print()f()
2.通过写一个布尔变量,来判断是否跳出
flag=Truefor i in range(1,10):for j in range(1,i+1):if i*j>25:flag=Falsebreakprint("%dx%d=%d"%(i,j.i*j),end='')if not flag:breakprint()
3.用循环自带的else结构来实现
for i in range(1,10):for j in range(1,i+1):if i*j>25:flag=Falsebreakprint("%dx%d=%d"%(i,j,i*j),end='')else:print()continuebreak
4.抛出异常
4.元组Tuple
元组是一个不可变的序列,所有的操作方式基本上和列表一致
使用()来创建元组
#创建一个空元组t=()print(t,type(t))t1 = (1,2,3,4,5)print(t1)#打印元组print(t1[3])#使用[index]去访问tuple中的元素(元组中的数据不能修改)t1[3]=5# TypeError: 'tuple' object does not support item assignment 否则会产生以上报错#当tuple不是空的时候,可以忽略()t2=10,20,30,40,50print(t2)
#元组的解包-即分别输出元组中的元素a,b,c,d,e=t2print(a)print(b)print(c)print(d)print(e)#可以利用元组的解包特点来交换数值a=10b=20a,b=b,aprint(a,b)#因为是逐个对应所以进行解包的时候要匹配# 少了会# ValueError: too many values to unpack (expected 4)# 多了会# ValueError: not enough values to unpack (expected 6, got 5)#可以利用*来匹配元组,只能出现一次a,b,*c = t2print(a)print(b)print(c)#c会打印出剩下的所有没被包括的元组1020[30, 40, 50]
序列的比较
即比较两个序列的值
arr1=[1,2,3]arr2=[1,2,3]print(arr1==arr2)#在python中==即为比较两个序列的值#Truet1 = 1,2,3t2 = 1,2,3print(t1 == t2)# True# 比较是否是同一个 is修饰符 print(t1 is t2) # Falseprint(arr1 is arr2) # False
字典
相当于java的map结构,java中HashMap
列表存储性能很好,列表是最快索引查找,如果是查询某一个,性能很差
链表是适合最简单的增加 删除
字典因为是key-value结构,查询特定元素很快
d={}#创建一个空的字典print(d)d={'zhangsan':80,'lisi':go','wangwu':100}print(d)d = {'zhangsan':80, 'lisi':90, 'wangwu': 100}print(d,type(d))
字典的值可以任意对象,键是不可变对象,一般都是用字符串(str,int,tuple,blood)
# 使用键来获取值print(d['zhangsan']) # 80print(d['yangmi']) # 如果键不存在,会报错 KeyError: 'yangmi'
# 可以使用dict函数来创建字典,参数名就是键(字符串),值就是值
d3 = dict(name='张三',age=20)
# 使用len()返回字典的键的个数
# in 可以用来判断是否存在某个键
#get可以根据键来获取值,支持默认值
print(d3.get('name')) # 张三print(d3.get('gender')) # Noneprint(d3.get('gender','男')) # 如果gender为None,则使用默认值'男'
#可以通过键来直接修改值,如果该值不存在则添加,如果该值存在则不添加,否则添加一个默认值。
d3['gender'] = '女'd3.setdefault('score','80')
删除:
# 删除del d3['score']print(d3)d3 = dict(name='张三',age=20)#创建字典,姓名为张三,年龄为20a = d3.pop('name')#使用pop获取名字print(a)print(d3)# popitem a = d3.popitem()print(a,d3)# ('age', 20) {'name': '张三'}
遍历:
# 遍历键 d = {'zhangsan':80, 'lisi':90, 'wangwu': 100}for key in d.keys():#keyprint(key,d[key]) # 遍历值for v in d.values():#数值print(v)# items取出的都是tuple,可以解包用for k,v in d.items():#元组print(k,v)
字典的实际运用:
def do_0():print(0)def do_1():print(1)def do_2():print(2) switch = {'零': do_0,'一':do_1,'二':do_2}switch.get('零')()
字符串:
'capitalize',
'casefold',
'center',
'count',
'encode',
'endswith',
'expandtabs',
'find', 在指定范围内找一个字符串,相当于java indexOf 没有返回-1
'format',
'format_map',
'index', 和find一样,没有直接报错
'isalnum', 都是字母和数字
'isalpha', 都是字母
'isascii',
'isdecimal', 都是数字
#判断b是否是纯数字b = '0' '\u00b3' '零' print(b.isdecimal()) # True False False
'isdigit', 只包含数字(支持多进制)
#判断b是否包含数字b = '0' '\u00b3' '零' print(b.isdigit()) # True True False
'isidentifier',
'islower',
'isnumeric', 都是数字
#判断是否都是数字(甚至支持中文诶)b = '0' '\u00b3' '零' print(b.isnumeric()) # True True True 可以支持中文大小写
'isprintable',
'isspace',
'istitle',
'isupper',
'join',
'ljust',
'lower',
'lstrip',
'maketrans',
'partition', 将字符串分成
#在b前后划分字符串s = 'aaaaabcccc's2 = s.partition('b')print(s2)# ('aaaaa', 'b', 'cccc')#str对完整字符串进行分割,str为从字符串**左侧**开始匹配到的第一个字符串
'removeprefix',
'removesuffix',
'replace',
#指定把a替换为c 指定次数为2次s = 'abaacaa's1 = s.replace('a','c',2) 可以指定次数哦,默认是全部替换print(s1)
'rfind', 从右到左找 相当于java lastIndexOf
'rindex',
'rjust',
'rpartition',
s = 'aaaaabcccc's2 = s.partition('b')print(s2)# ('aaaaa', 'b', 'cccc')#从右向左寻找指定字符串并分割s2 = s.rpartition('b')# ('aaaaabcc', 'b', 'cccc')
'rsplit',
'rstrip', 去除右边的空白
'split',
'splitlines',
'startswith',
'strip',
'swapcase',
'title',
'translate',
'upper',
'zfill'
集合
a = {1,2,3,4,5,5}print(a)# {1, 2, 3, 4, 5}# 将字符串转换成seta = set('zhangsan')print(a)# {'h', 'a', 'n', 'g', 'z', 's'}
集合的运算
1.交集 &
a = {1,2,3,4,5,6}b = {3,4,5,6,7,8}print(a & b)# {3, 4, 5, 6}
2.并集 |
print(a | b)# {1, 2, 3, 4, 5, 6, 7, 8}
3.差集 -
print(a - b)print(b - a)print(a - a)#{1, 2}#{8, 7}
4.异或 ^
print(a ^ b)print((a | b) - (a & b) )# {1, 2, 7, 8}# {8, 1, 2, 7}
5.一个集合是否包含另外一个集合 <
a = {1,2,3}b = {1,2,3,4,5}print(a < b) # True
6.一个集合是否是另外一个集合的超集 >
a = {1,2,3}b = {1,2,3,4,5}print(b > a) # True
如果觉得《【Python】从入门到入土2》对你有帮助,请点赞、收藏,并留下你的观点哦!