目录
01-公共方法
02-课堂练习
03-推导式
04-函数
05-函数的变量作用域
06-多函数程序流程
07-函数的返回值
08-函数的参数
09-拆包和交换变量
10-引用
11-学生信息管理系统(函数版)
12-递归函数
01-公共方法
'''
01-公共方法
1.运算符
1.1 + 合并(连起来) 字符串、列表、元组
1.2 * 复制 字符串、列表、元组
1.3 in 存在 字符串、列表、元组、集合、字典
1.4 out in 不存在 字符串、列表、元组、集合、字典
2.内置函数(rlmmde人来命名的)
1.range(start,end,step)范围函数
2.len() 计算长度
3.max 最大值
4.min 最小值
5.del 删除
del()
del list[]
list.del()
6.enumerate() 枚举获取容器下标和元素
3.类型转换(lstul)
1.list() 列表
2.set() 集合
3.tuple() 元组
'''
# 1.1 +
# 字符串合并
str1 = "hello"
str2 = "world"
str3 = str1 + str2
print("1.1 字符串合并:",str3)
# 列表合并
list1 = ['张无忌','赵敏']
list2 = ['小昭','周芷若']
list3 = list1 + list2
print("1.1 列表合并:",list3)
# 元组合并
tup1 = ('韦小宝',28)
tup2 = ('令狐冲',28)
tup3 = tup1 + tup2
print("1.1 元组合并:",tup3)
# 1.2 复制 *
# 字符串复制
print("1.2 字符串复制:"*10)
# 列表复制(同一个列表中)
list4 = [12,18,19]*5
print("1.2 列表复制:",list4)
# 元组复制(同一个元组中)
tup4 = ('小龙女',18)*3
print("1.2 元组复制:",tup4)
# 1.3 in 存在
print("1.3 字符串存在:",'e' in str1)
print("1.3 列表存在:", 12 in list4)
print("1.3 元组存在:", '小龙女' in tup4)
# 字典的存在(默认匹配字典中key)
dicts = {'name':'张无忌'}
print("1.3 字典存在:",'name' in dicts)
print("1.3 字典存在:",'张无忌' in dicts)
# 集合的存在
sets = {'张学友',18}
print("1.3 集合存在:",18 in sets)
# 1.4 not in 不存在
print("1.4 字符串不存在:",'e' not in str1)
print("1.4 列表不存在:",'赵敏' not in list1)
print("1.4 元组不存在:",'韦小宝' not in tup1)
# 字典不存在
print("1.4 字典不存在:",'name' not in dicts)
# 集合不存在
print("1.4 集合不存在:",'张学友' not in sets)
# 2.1 range范围(生成的序列不包含end范围)
# 起始位置<= <结束位置
for i in range(1,10,1):
print("第一种方式:",i)
for i in range(1,10,2):
print("第二种方式:",i)
for i in range(10):
print("第三种方式:",i)
# 2.2 len()
str1 = "HelloWorld"
print("2.1 len字符串:",len(str1))
lt1 = [18,20,19,30]
print("2.1 len列表:",len(lt1))
tp1 = ('张无忌',18)
print("2.1 len元组:",len(tp1))
st1 = {'赵敏',28}
print("2.1 len集合:",len(st1))
dt1 = {'name':'小龙女','age':18}
print("2.1 len字典:",len(dt1))
# 2.5 del del()
# del str1
# print("2.2 del字符串:",str1)
# del lt1[0]
# print("2.2 del列表:",lt1)
# 元组不能删除
# del st1
# print("2.2 del集合:",st1)
# del dt1['name']
# print("2.2 del字典:",dt1)
# 2.3 max最大值
print("2.3 max字符串:",max(str1))
print("2.3 max列表:",max(lt1))
# tp1中有字符串和整型
# 注意:tuple中比较的是同一种类型
tp1 = (18,29,7,99)
print("2.3 max元组:",max(tp1))
# 注意:set中比较的是同一种类型
st1 = {19,20,30}
print("2.3 max集合:",max(st1))
# 注意:dict中比较的是key的值
print("2.4 max字典:",max(dt1))
# 2.4 min最小值
print("2.4 min字符串:",min(str1))
print("2.4 min列表:",min(lt1))
print("2.4 min元组:",min(tp1))
print("2.4 min集合:",min(st1))
print("2.4 min字典:",min(dt1))
# 2.6 enumerate(可遍历对象,start=0)枚举
# 注意:start参数用来设置遍历数据的下标起始位置,默认为0
# 遍历的item选项(下标,元素值)
lt = [18,30,40,50,60,70,80]
for i in enumerate(lt):
print("枚举第一种方式:",i)
# 起始位置从1开始但是总数不变
for ix,num in enumerate(lt,start=1):
print("枚举第二种方式:%d>>>%d"%(ix,num))
list4 = [77,88,99]
set4 = {101,102,103}
print("列表转换为元组:",tuple(list4))
print("集合转换为元组:",tuple(set4))
tup4 = ('张曼玉',18)
str4 = "HelloWorld"
print("元组转换列表:",list(tup4))
print("集合转换列表:",list(set4))
print("字符串转换列表:",list(str4))
print("列表转集合:",set(list4))
print("元组转集合:",set(tup4))
02-课堂练习
'''
02-课堂练习
1.使用列表[13,56,78,9,36,99]
1.1 排序算法 升序和降序各做一个
1.2 不准使用max() min()
2.用户输入年月日 20220323
通过计算 输出该日期是今年的第多少天
2.1 判断是否是闰年
2.2 判断用户输入的位数是否正确以及类型
2.3 判断用户输入年、月、日是否正确
'''
#1
numList=[13,56,78,9,36,99]
numList.sort(key=None,reverse=False)
print("升序:",numList)
numList.sort(key=None,reverse=True)
print("降序:",numList)
'''
1.升序和降序
'''
lt = [13,56,78,9,36,99]
# 升序
# 13,56,78,9,36
for x in range(0,len(lt)-1):
# 56,78,9,36,99
for y in range(x,len(lt)):
# 9 < 78
if lt[y] < lt[x]:
temp = lt[x]
lt[x] = lt[y]
lt[y] = temp
print("升序结果:",lt)
# 降序
lt = [13,56,78,9,36,99]
for x in range(0,len(lt)-1):
for y in range(x,len(lt)):
if lt[y] > lt[x]:
temp = lt[x]
lt[x] = lt[y]
lt[y] = temp
print("降序结果:",lt)
#2
"""
这个我写的不流畅,原因:
1.字符串切片
1.1知识点案例是直接用老师的,所以知识点记得不牢
1.2和列表的split()分割混淆
字符串切片针对字符串
形式为 字符串名[start:end:step](左闭右开,若想取到下标2的元素值,右边要写下标3)
字符串在使用split()后,返回的是列表类型
形式为 字符串.split(分割字符,分割次数)
2.对于for循环
for 循环内是不停重复的,而且步长为1,应该是python没有关键词,所以经常忽视掉内循环操作
3.range()内放数字
enumerate()内放列表等
"""
import sys
userdate = input("请输入年月日:")
if userdate.isdigit() and len(userdate)==8:
sumdays=0
#字符串切片 左闭右开
year=int(userdate[0:4])
month=int(userdate[4:6])
day=int(userdate[6:8])
for months in range(1,month):
if months in [1,3,5,7,8,10,12]:
sumdays +=31
elif months in [4,6,9,11]:
sumdays +=30
else:
sumdays +=29 if year%400==0 or (year%4==0 and year%100!=0) else 28
print("现在是%d月,已过%d天。"%(months,sumdays))
print("%d是本年的第%d天。"%(int(userdate),sumdays+day))
03-推导式
'''
03-推导式
快速初始化列表,字典,集合;简化代码
1.列表:[ xx for xx in range() ]
2.字典:{xx1:xx2 for ... in ...}
3.集合:{xx for xx in ...}
'''
#while 循环初始化列表
li=[]
x=0
while x<10:
li.append(x)
x+=1
print("while循环初始化列表:",li)
#1.1列表推导式
l1=[ i for i in range(len(li))]
print("列表推导式:",l1)
#1.2列表推导式-range步长
l2=[ i for i in range(0,10,2)]
print("列表推导式-range:",l2)
#1.3列表推导式-if
l3=[ i for i in range(0,10) if i%2==0]
print("列表推导式-if:",l3)
#1.4列表推导式-多重for循环 最好顶多两个
l4=[ (i,j) for i in range(10) for j in range(10)]
#2.1字典推导式
di1={i:i**2 for i in range(5)}
print("字典推导式:",di1)
#2.2字典推导式-列表合并
dic1=['name','age','sex']
dic2=['lili',32,'girl']
di2={ dic1[i]:dic2[i] for i in range(0,3)}
print("字典推导式-列表合并:",di2)
#2.3字典推导式-for-if语句
dic3={'lili':1,'lulu':2,'lrlr':3,'lele':2}
di3={ key for key,value in dic3.items() if value==2}
print("字典推导式-for-if:",di3)
#2.4集合推导式
se=[2,2,3]
se1={se[i] for i in range(len(se))}
print("集合推导式:",se1)
04-函数
'''
04-函数
1.作用
定义一个方法,可以在使用时调用
简化代码
2.使用步骤
先定义后调用
定义:def 函数名(形参列表):
函数体【属性,方法】
返回值
调用:类对象.函数名()
3.名词解释
参数:
形参:参数列表里的
实参:传入的数据(引用地址值)
返回值:
当返回值时元组时,可以返回多个值
说明文档:
函数中添加文档注释,用help(函数名)
4.高级应用
嵌套
'''
#1
def d1(d):
print(d)
for i in range(4):
d1(i)
#1
def name():
return 'lili'
print("name:",name())
#1
def add(a,b):
return a+b
print('a+b=%d',add(1,2))
#1
def names():
return 'lili',18
print("函数返回值多个:",names())
def sumNum(a,b,c):
return a+b+c
result = sumNum(10,20,30)
def avgNum(a,b,c):
return sumNum(a,b,c)/3
rt = avgNum(10,20,30)
print(rt)
#help
def getMsg():
"""江苏师范大学的文档说明书"""
print("江苏师范大学")
help(getMsg)
'''
6.函数的嵌套调用
6.1 函数嵌套调用是否有先定义后使用?
可以先使用后定义
预编译===>python解释器中执行
6.2 函数调用的时候-函数是否被创建?
函数调用函数的时候用的是同一个地址值
注意事项:
此操作仅限于同一个类中(必须要注意)
'''
def testB():
print("B函数被调用-start")
testA()
print("testA的id",id(testA()))
print("B函数被调用-end")
def testA():
print("A函数被调用-start")
print("A函数被调用-end")
# 调用testB
testB()
# 测试地址值
print("测试:",id(testB()))
print("测试2:",id(testA()))
05-函数的变量作用域
'''
05-函数的变量作用域
全局变量:整个程序
局部变量:函数内
*全局变量和局部变量重名-->两个表示同一个变量-->地址值不同,值也不同
注意:函数内修改全局变量,修改不是数据值,而是变量的地址值
因此重名时,函数内的变量地址值已经变了,自然不同
*global将局部变全局
将原有的引用地址值修改成新的变量
'''
# 1.变量的定义
# 全局变量
name = "张学友"
def getMessage():
# 局部变量
age = 18
print(f'姓名:{name},年龄:{age}')
def getMessage2():
age = 30
print(f"姓名:{name},年龄:{age}")
getMessage()
getMessage2()
# 2.变量的修改
print("修改之前:",id(name))
def setName():
# 函数内修改全局变量 重新声明并初始化name
name = "张曼玉"
print("修改之后:",id(name))
print(f"setName===>姓名:{name}")
setName()
print(f"函数外调用:{name}")
# 3.函数中的修改全局变量
print("setName2修改之前:",id(name))
def setName2():
global name
name = "张三丰"
print("setName2修改之中:",id(name))
print(f'姓名:{name}')
setName2()
print(f"setName2修改后:{name}")
print(f"setName2修改后:",id(name))
06-多函数程序流程
'''
06-多函数程序流程
一个程序由多个函数组成,并且多个函数共享某些数据
# 1.共用全局变量
# 2.返回值作为参数传递
'''
# 1.共用全局变量
age = 19
def eat():
global age
if age == 19:
print("我可以吃青椒肉丝盖浇饭")
# 局部修改全局变量
age = 23
def drink():
if age > 20:
print("保温杯内泡枸杞")
else:
print("百试百灵灵丹妙药-多喝喝水")
eat()
drink()
# 2.返回值作为参数传递
def testA():
return "张无忌"
def testB(name):
print(f"我的姓名是:{name}")
testB(testA())
07-函数的返回值
'''
07-函数的返回值
1.return可以结束函数,后面的代码不再执行
2.return可以返回多个变量,返回的数据类型为元组
3.return可以返回list,dict,tuple等类型
'''
# 1.函数两个return
def getName():
return "张无忌"
return "张三丰"
print("我的姓名是:",getName())
# 2.函数return 返回多个变量
def getNum():
return 1,2
print("我的返回值是:",getNum())
def getList():
a = 30
b = 40
lt = [a,b]
return lt
print("返回列表:",getList())
08-函数的参数
'''
08-函数的参数
1.位置传参
顺序、位置、个数必须一致
2.关键字传参
若有位置参数则在前面,关键字参数之间不能在顺序
3.缺省值参数
默认为缺省值参数赋值,若传递则使用传递的值
若不传递则使用缺省值
注意事项:
函数的定义和调用时候必须要保证缺省值在最后
4.不定长参数
可变参数,使用包裹(关键字传参、位置传参)
*args:包裹位置传参,可以接收多个参数值
**kwargs:包裹关键字传参,可以接收多个关键字的设置传参
以上组包的过程
'''
#1.位置传参
def getStudent1(name,age,sex):
print(f"name:{name},age:{age},sex:{sex}")
getStudent1('lili',19,'gril')
#2.关键词传参
def getStudent2(name,age,sex):
print(f"name:{name},age:{age},sex:{sex}")
getStudent2(sex='boy',age=23,name='lulu')
#3.缺省值传参
def getStudent3(name,age,sex='boy'):
print(f"name:{name},age:{age},sex:{sex}")
getStudent3('lili',23)
#4.不定长传参
def getInfo(*args):
print(args)
getInfo()
getInfo(12)
getInfo(12,'de')
def getInfo2(**kwargs):
print(kwargs)
getInfo2(name='lili',age=12,sex='girl')
09-拆包和交换变量
'''
09-拆包和交换变量
1.拆包-元组
2.拆包-字典
3.交换变量
'''
#1.拆包-元组
def gettuple(*args):
a,b=args
print(a)
print(b)
gettuple('lili',18)
#2.拆包-字典
def getdice(**kwargs):
a,b=kwargs
print(a)
print(b)
print(kwargs[a])
print(kwargs[b])
getdice(name='lili',age=12)
#3.交换变量
def changeNum1(a,b):
c=a
a=b
b=c
print(a,b)
changeNum1(10,20)
def changeNum2(a,b):
a,b=b,a
print(a,b)
changeNum2(10,20)
10-引用
'''
10-引用
*id()查看地址值
*可变类型:地址值不变 值改变【列表、字典、集合】
&不可变类型:地址值变化 值改变【整型、浮点型、元组、字符串】
以下解释想看就看,记住**内容就行了。
# python中是使用引用地址值进行传递 id()可以查看是否为同一地址
# id()可以理解为内存中那块标识区域
#
# 可变类型和不可变类型的区分
# 可变类型:地址值不变 值改变
# 不可变类型;地址值变化 值改变
#
# 可变类型(引用地址值不变,修改内部元素值):
# 列表、字典、集合
# 不可变类型(引用地址值改变):
# 整型、浮点型、元组、字符串
'''
# 1.int类型 ===>不可变类型
a = 10
# 将a的引用地址值赋值给b
# b = a
# 将10的引用地址值赋值给b
# b = 10
# 将12的引用地址值赋值给b
b = 12
print("int类型:",a == b)
print("int类型2:",a is b)
print("a的地址值:",id(a))
print("b的地址值:",id(b))
# 2.列表 可变类型 更改内部元素地址值不变
listNum = [1,99,22]
listNum2 = [1,99,22]
print("列表类型:",listNum == listNum2)
print("列表类型2:",listNum is listNum2)
print("listNum的值:",id(listNum))
print("listNum2的值:",id(listNum2))
listNum2.append(88)
print("listNum2-添加后:",id(listNum2))
print("列表中元素值对比1:",listNum[0] == listNum2[0])
print("列表中元素值对比2:",listNum[0] is listNum2[0])
print("列表中元素值对比3:",id(listNum[0]))
print("列表中元素值对比4:",id(listNum2[0]))
print("="*20)
# 3.引用作为实参
def getMsg(a):
print("修改前的a",a)
print("修改前的a===>id",id(a))
a += a
print("修改后的a",a)
print("修改后的a===>id",id(a))
# 不可变类型的参数传递
b = 10
getMsg(b)
print("="*30)
lt = [10,20]
getMsg(lt)
11-学生信息管理系统(函数版)
'''
11-学生信息管理系统(函数版)
课堂练习:
1.添加addStudent 删除delStudent
查询 queryStudent 修改updateStudent
程序主函数 smss函数(程序结构)
2.设置全局变量 students===>list===>dict
3.用户命令的传参 返回值
4.使用main函数调用所有的函数
'''
import sys
studentList=[]
operateList=['addStudent','delStudent','updateStudent','queryStudent','exit']
def smss():
while True:
for i in range(0,len(operateList)):
print("%d.%s"%(i+1,operateList[i]))
num=int(input('请选择您要执行的操作序号:'))
if num==1:
addStudent()
elif num==2:
delStudent()
elif num==3:
updateStudent()
elif num==4:
queryStudent()
elif num==5:
sys.exit(0)
else:
print("wrong!")
def addStudent():
student=input("请输入您要添加的学生信息,学号、姓名、性别、年龄使用逗号分隔")
student=student.split(',')
studentList.append(student)
def delStudent():
for i in range(0,len(studentList)):
print("%d.%s"%(i,studentList[i]))
index=int(input("请输入您要删除的学生下标"))
del studentList[index]
def updateStudent():
for i in range(0,len(studentList)):
print("%d.%s"%(i,studentList[i]))
index=int(input("请输入您要修改的学生下标"))
student=input("请输入您要添加的学生信息,学号、姓名、性别、年龄使用逗号分隔")
student = student.split(',')
studentList[index]=student
def queryStudent():
for i in range(0,len(studentList)):
print("%d.%s"%(i,studentList[i]))
if __name__ == '__main__':
smss()
12-递归函数
'''
12-递归函数
*自己调用自己
*有终止
'''
def addNum(num):
if num==1:
return 1
else :
return num+addNum(num-1)
# num: 3+2+1
print("3以内的数字累加和:",addNum(3))
print("100以内的数字累加和:",addNum(100))