5 函数二

  • Post author:
  • Post category:其他




5.1 局部变量

局部变量,就是在函数内部定义的变量

  • 其作用范围是这个函数内部,即只能在这个函数中使用,在函数的外部是不能使用的



5.2全局变量

  • 在函数外边定义的变量叫做全局变量
  • 如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量
  • 全局变量能够在所有的函数中进行访问
  • 没有global时,当函数内出现局部变量和全局变量相同名字时,函数内部中的 变量名 = 数据 此时理解为定义了一个局部变量,而不是修改全局变量的值
  • 如果在函数中出现global 全局变量的名字 那么这个函数中即使出现和全局变量名相同的变量名 = 数据 也理解为对全局变量进行修改,而不是定义局部变量



5.3多函数程序的基本使用流程

一般在实际开发过程中,一个程序往往由多个函数(后面知识中会讲解类)组成,并且多个函数共享某些数据,这种场景是经常出现的,因此下面来总结下,多个函数中共享数据的几种方式

  1. 使用全局变量
  2. 使用函数的返回值、参数
  3. 函数嵌套调用



5.4 函数返回值(二)

  1. 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
  1. 一个函数返回多个数据的方式
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)