5.1 局部变量
局部变量,就是在函数内部定义的变量
- 其作用范围是这个函数内部,即只能在这个函数中使用,在函数的外部是不能使用的
5.2全局变量
- 在函数外边定义的变量叫做全局变量
- 如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量
- 全局变量能够在所有的函数中进行访问
- 没有global时,当函数内出现局部变量和全局变量相同名字时,函数内部中的 变量名 = 数据 此时理解为定义了一个局部变量,而不是修改全局变量的值
- 如果在函数中出现global 全局变量的名字 那么这个函数中即使出现和全局变量名相同的变量名 = 数据 也理解为对全局变量进行修改,而不是定义局部变量
5.3多函数程序的基本使用流程
一般在实际开发过程中,一个程序往往由多个函数(后面知识中会讲解类)组成,并且多个函数共享某些数据,这种场景是经常出现的,因此下面来总结下,多个函数中共享数据的几种方式
- 使用全局变量
- 使用函数的返回值、参数
- 函数嵌套调用
5.4 函数返回值(二)
- if-elif-else和 return
def create_nums(num):
print("---1---")
if num == 100:
print("---2---")
return num+1 # 函数中下面的代码不会被执行,因为return除了能够将数据返回之外,还有一个隐藏的功能:结束函数
else:
print("---3---")
return num+2
print("---4---")
result1 = create_nums(100)
print(result1) # 打印101
result2 = create_nums(200)
print(result2) # 打印202
- 一个函数返回多个数据的方式
def divid(a, b):
shang = a//b
yushu = a%b
return shang, yushu #默认是元组
result = divid(5, 2)
print(result) # 输出(2, 1)
return后面可以是元组,列表、字典等,只要是能够存储多个数据的类型,就可以一次性返回多个数据
如果return后面有多个数据,那么默认是元组
5.5函数参数(二)
- 缺省参数
在形参中默认有值的参数,称之为缺省参数
调用函数时,缺省参数的值如果没有传入,则取默认值。
注意:带有默认值的参数一定要位于参数列表的最后面
- 不定长参数
有时可能需要一个函数能处理比当初声明时更多的参数, 这些参数叫做不定长参数,声明时不会命名。
基本语法如下:
def functionname([formal_args,] *args, **kwargs):
"""函数_文档字符串"""
function_suite
return [expression]
加了星号(*)的变量args会存放所有未命名的变量参数,args为元组
而加**的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典.
如果很多个值都是不定长参数,那么这种情况下,可以将缺省参数放到 *args的后面, 但如果有**kwargs的话,**kwargs必须是最后的
5.6 拆包和交换变量的值
- 拆包
a, b = (1, 2)
print(a) 1
print(b) 2
- 交换变量的值
a, b = 5, 4
a, b = b, a
5.7 引用1
-
在python中,值是靠引用来传递来的。
-
我们可以用id()来判断两个变量是否为同一个值的引用。 我们可以将id值理解为那块内存的地址标示。
5.8 可变、不可变类型
- 所谓可变类型与不可变类型是指:数据能够直接进行修改,如果能直接修改那么就是可变,否则是不可变
- 可变类型有: 列表、字典、集合
- 不可变类型有: 数字、字符串、元组
5.9 引用2
- Python中函数参数是引用传递(注意不是值传递)
- 对于不可变类型,因变量不能修改,所以运算不会影响到变量自身
- 而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量
另加知识点
import copy
spam = ['A', 'B', 'C', 'D']
list1 = copy.copy(spam)
print(list1)
list1[1] = 11
print(spam)
print(list1)
5.10 学生管理系统-list
"""
for i in info_list: # i就是每一个小列表
if name in i: # 判断名字在不在小列表中
....
break # 如果找到第一个成功了,后面不用再找了
else:
# 这里的代码什么时候执行??
# for循环什么时候结束?两种情况:
# 1、通过break结束
# 2、遍历完所有的元素,if的条件都没有成立,for循环也会结束
print("【ERROR】:删除不成功,查无此人!")
# 注意:!!! 这里的代码第二种情况才会执行
"""
import sys
info_list = [['诸葛亮', '40', '男'], ['刘备', '45', '男']] # 这个列表用来保存所有的名片,它里面每一个元素就是每一个小名片(列表)
def welcome():
"""
打印界面
"""
print("-" * 30)
print("--------名片管理器v1.0--------")
print("----1、添加名片")
print("----2、删除名片")
print("----3、修改名片")
print("----4、查询名片")
print("----5、退出系统")
print("-" * 30)
while True:
# 打印界面
welcome()
# 让用户输入数字,表示对应的操作
command = input("请输入数字1~5表示对应的操作:")
# 判断用户输入的这个数字command,根据它来执行对应的功能(代码)
if command == "1":
# 添加名片 就是 往大列表info_list,添加某个人的名片
name = input("请输入姓名:")
age = input("请输入年龄:")
sex = input("请输入性别:")
info_list.append([name, age, sex]) # 把name, age, sex整合成一个小列表,追加到大列表info_list中
print("【INFO】:添加成功!")
print(info_list) # 自己测试用,看看有没有添加成功
elif command == "2":
# 删除名片
# [['诸葛亮', '40', '男'], ['刘备', '45', '男']]
name = input("请输入要删除这个名片的姓名:")
for i in info_list: # i就是每一个小列表
if name in i: # 判断名字在不在小列表中
# 在,才执行这里的代码,就删除
# 在大列表中删除小列表
info_list.remove(i)
print("【INFO】:删除成功!")
print(info_list)
break # 如果找到第一个成功了,后面不用再找了
else:
# 这里的代码什么时候执行??
# for循环什么时候结束?两种情况:
# 1、通过break结束
# 2、遍历完所有的元素,if的条件都没有成立,for循环也会结束
print("【ERROR】:删除不成功,查无此人!")
# 注意:!!! 这里的代码第二种情况才会执行
elif command == "3":
# 修改名片
# [['诸葛亮', '40', '男'], ['刘备', '45', '男']]
name = input("请输入要修改这个名片的姓名:")
for i in info_list: # i就是每一个小列表
if name in i: # 判断名字在不在小列表中
# 在,才执行这里的代码,就修改
new_name = input("请输入新的姓名:")
new_age = input("请输入新的年龄:")
new_sex = input("请输入新的性别:")
# 如果在列表中修改数据?通过下标来修改:列表名[下标] = 值
info_list[info_list.index(i)] = [new_name, new_age, new_sex]
print("【INFO】:修改成功!")
print(info_list)
break # 如果找到第一个成功了,后面不用再找了
else:
print("【ERROR】:删除不成功,查无此人!")
elif command == "4":
# 查询名片
# [['诸葛亮', '40', '男'], ['刘备', '45', '男']]
name = input("请输入要查询的名片的姓名:")
for i in info_list: # i就是每一个小列表
if name in i: # 判断名字在不在小列表中
print("【INFO】:这个人的信息如下:%s" % i)
break # 如果找到第一个成功了,后面不用再找了
else:
print("【ERROR】:删除不成功,查无此人!")
elif command == "5":
# 退出系统
# break
sign = input("确定要退出系统吗?(yes or no):")
# if sign == "yes" or sign == "y":
# if sign in ["yes", "y", "Y", "YES"]:
if sign.lower() in ["yes", "y"]:
print("【INFO】:成功退出系统!")
sys.exit()
else:
print("【ERROR】:请务必输入数字1~5")
print(123456)
5.11 水仙花数
"""
打印水仙花数:
# 旧知识点回顾
2、打印出100-999之间所有的"水仙花数"。("水仙花数"是指一个三位以上的整数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。)
i // 100
i % 100 // 10
i % 10
int(str(i)[0]) 取百位上的数字
"""
# for i in range(100, 1000):
# if i == (i // 100) ** 3 + (i % 100 // 10) ** 3 + (i % 10) ** 3:
# print(i)
for i in range(100, 1000):
if i == (int(str(i)[0])) ** 3 + (int(str(i)[1])) ** 3 + (int(str(i)[2])) ** 3:
print(i)
5.12 字典的应用
"""
字典的应用:
要求:
1、定义一个函数,可以让用户在键盘上按小写字母z到m这一排中的某个字母进行输入时,对应输出位于其上方的字母。如果输入的不在小写字母zxcvbnm,则提示"输入错误,请重新输入"
(例如:输入z,对应输出a;输入x,对应输出s;输入c,对应输出d;...输入m,对应输出j)
要求:
1.用字典来完成 dic = {"z": "a", "x": "s" ... }
2.输入之后要检验是否在小写字母zxcvbnm中,且长度要为1
3.可以循环使用这个功能,也可以退出
"""
import sys
dic = {"z": "a", "x": "s", "c": "d", "v": "f", "b": "g", "n": "h", "m": "j"}
def fn():
while True:
str1 = input("请在zxcvbnm中选择输入一个字母(输入q表示退出):")
if str1 == "q":
# return
sys.exit()
if (str1 in "zxcvbnm") and (len(str1) == 1):
# 例如:输入z,对应输出a;输入x,对应输出s;输入c,
# 满足这个条件,说明str1已经是dic字典中的某一个键了,就可以通过这个str1键名来找到对应的值 字典名[键名]
print(dic[str1])
else:
print("输入错误,请重新输入")
# while True:
# fn()
fn()
"""
{"name": '诸葛亮', "age": 40, "sex": "男"}
"""
import sys
info_list = [{"name": '诸葛亮', "age": 40, "sex": "男"}, {"name": '刘备', "age": 45, "sex": "男"}] # 这个列表用来保存所有的名片,它里面每一个元素就是每一个小名片(列表)
user_name = "admin"
password = "123456"
def welcome():
"""
打印界面
"""
print("-" * 30)
print("--------名片管理器v1.0--------")
print("----1、添加名片")
print("----2、删除名片")
print("----3、修改名片")
print("----4、查询名片")
print("----5、查询所有名片")
print("----6、退出系统")
print("-" * 30)
while True:
# 打印界面
welcome()
# 让用户输入数字,表示对应的操作
command = input("请输入数字1~5表示对应的操作:")
# 判断用户输入的这个数字command,根据它来执行对应的功能(代码)
if command == "1":
# 添加名片 就是 往大列表info_list,添加某个人的名片
name = input("请输入姓名:")
age = input("请输入年龄:")
sex = input("请输入性别:")
dic = {"name": name, "age": age, "sex": sex}
info_list.append(dic) # 把name, age, sex整合成一个小列表,追加到大列表info_list中
print("【INFO】:添加成功!")
print(info_list) # 自己测试用,看看有没有添加成功
elif command == "2":
# 删除名片
# [{"name": '诸葛亮', "age": 40, "sex": "男"}, {"name": '刘备', "age": 45, "sex": "男"}]
name = input("请输入要删除这个名片的姓名:")
for i in info_list: # i就是每一个小列表
if name in i.values(): # 判断名字在不在小列表中
# 在,才执行这里的代码,就删除
# 在大列表中删除小列表
info_list.remove(i)
print("【INFO】:删除成功!")
print(info_list)
break # 如果找到第一个成功了,后面不用再找了
else:
# 这里的代码什么时候执行??
# for循环什么时候结束?两种情况:
# 1、通过break结束
# 2、遍历完所有的元素,if的条件都没有成立,for循环也会结束
print("【ERROR】:删除不成功,查无此人!")
# 注意:!!! 这里的代码第二种情况才会执行
elif command == "3":
# 修改名片
#
name = input("请输入要修改这个名片的姓名:")
for i in info_list: # i就是每一个小列表
if name in i.values(): # 判断名字在不在小列表中
# 在,才执行这里的代码,就修改
new_name = input("请输入新的姓名:")
new_age = input("请输入新的年龄:")
new_sex = input("请输入新的性别:")
# 如果在列表中修改数据?通过下标来修改:列表名[下标] = 值
info_list[info_list.index(i)] = {"name": new_name, "age": new_age, "sex": new_sex}
print("【INFO】:修改成功!")
print(info_list)
break # 如果找到第一个成功了,后面不用再找了
else:
print("【ERROR】:删除不成功,查无此人!")
elif command == "4":
# 查询名片
# [['诸葛亮', '40', '男'], ['刘备', '45', '男']]
name = input("请输入要查询的名片的姓名:")
for i in info_list: # i就是每一个小列表
if name in i.values(): # 判断名字在不在小列表中
print("【INFO】:这个人的信息如下:%s" % i)
break # 如果找到第一个成功了,后面不用再找了
else:
print("【ERROR】:删除不成功,查无此人!")
elif command == "5":
# 查询所有名片
uname = input("请输入管理员账号:")
pwd = input("请输入管理员密码:")
if uname == user_name and pwd == password:
# 展示所有数据
# [['诸葛亮', '40', '男'], ['刘备', '45', '男']]
print(info_list)
# for i in info_list:
# # print(i)
# for j in i:
# print(j, end="\t")
# print()
else:
print("【ERROR】:用户名或者密码错误")
elif command == "6":
# 退出系统
# break
sign = input("确定要退出系统吗?(yes or no):")
# if sign == "yes" or sign == "y":
# if sign in ["yes", "y", "Y", "YES"]:
if sign.lower() in ["yes", "y"]:
print("【INFO】:成功退出系统!")
sys.exit()
else:
print("【ERROR】:请务必输入数字1~5")
print(123456)