# def print_text():
# print("Hello world!")
# print_text()
# def print_line():
# print("******")
# def print_text():
# print("hello world")
# print_line() # 调用函数
# print_line()
# print_text()
# print_line()
# print_line()
# 编写函数实现求两数中较小数
# def maxmin(m,n):
# if m>n:
# return n
# else:
# return m
# m = int(input("输入第一个数:"))
# n = int(input("输入第二个数:"))
# x = maxmin(m,n)
# x = maxmin(4,6)
# print("较小值为:{0}".format(x))
# ???计算长方形面积 用函数实现
# def area(w, h):
# s = w * h
# return s
# w = float(input("宽:"))
# h = float(input("高:"))
# s = area(w, h)
# print("面积为:{0}".format(s))
# 编写程序,要求输入字符串,计算字符串中大写字母和小写字母的个数并输出,计算过程用函数实现
# def demo(s): #定义函数
# a = 0
# b = 0
# for ch in s:
# if ch.isupper():
# a += 1
# elif ch.islower():
# b += 1
# return a,b
# s = input('请输入字符串:')
# c = demo(s)
# print(c,type(c))
# print('大写字母的个数为:',c[0],',小写字母的个数为:',c[1])
# 实参和形参
# 参数的类型可分为固定数据类型(如整数、浮点数、字符串、元组等)
# 和可变数据类型(如列表、字典、集合等)。当参数类型为固定数据类型时,
# 在函数内部 直接修改形参的值不会影响实参
# 但当参数类型为可变数据类型时,
# 在函数内部使用下标或其他方式为其增加、删除元 素或修改元素值时,
# 修改后的结果是可以反映到函数之外的,即实参也会得到相应的修改。
# 传不可变对象
# def immutabel(a):
# print(id(a)) # 指向的是同一个对象
# a = 10
# print(id(a)) # 一个新对象
# a = 1
# print(id(a))
# immutabel(a)
# 可以看见在调用函数前后,形参和实参指向的是同一个对象(对象 id 相同),
# 在函数内部修改形参后,形参指向的是不同的 id
# 传可变对象
# def changeme(mylist):
# "修改传入的列表"
# mylist.append([1, 2, 3, 4])
# print("函数内取值: ", mylist)
# return
#调用changeme函数
# mylist = [10, 20, 30]
# changeme(mylist)
# print("函数外取值: ", mylist)
# 位置参数
# def test_1(a,b,c):
# print(a,b,c)
# test_1(1,2,3) # 1,2,3
# test_1(1,2,) # TypeError: test_1() missing 1 required positional argument: 'c'
#默认参数(可不用为其传值)
# def test_2(name,age=18):
# print("姓名:",name)
# print("年龄:",age)
# return
# test_2("小慕")
# test_2("小沐",19)
# print(test_2.__defaults__) # 输出函数默认参数值
# 关键字参数(按参数名字传递参数的一种方式)
# def test_3(name,age):
# print("姓名:",name)
# print("年龄:",age)
# return
# test_3(name="小慕",age=27)
# 不定长参数
# “*args”和“**kwargs”为不定长参数,
# 前者用来接收任意多个实参并将其放 在一个元组中,
# 后者用来接收类似于关键字参数一样显式赋值形式的多个实参并将其放入字典中
# def test_4(a,b,c,*args,**kwargs):
# print(a)
# print(b)
# print(c)
# print(args)
# print(kwargs)
# test_4(1,2,3,4,5,6,x=1,y=6)
# 函数的嵌套
# 计算 1!+2!+3!+…+10!的值并输出,使用函数的嵌套调用实现。
# def cheng(k):
# i = 2
# t = 1
# while i <= k:
# t*= i
# i+=1
# return t
# def sum(n):
# i = 1
# sum=0
# while i <= n:
# sum+=cheng(i)
# i+=1
# return sum
# print("阶乘综合为:",sum(3))
# 递归函数(函数直接或间接的调用其本身)
# 直接递归调用/间接递归调用 无休止的去调用其本身 必须设定终止条件
# 计算n的阶乘 f(n)= f(n-1)*n
# def f(n):
# if n == 1:
# return 1
# else:
# return f(n-1)*n
# n = int(input("请输入一个正整数:"))
# print("n的阶乘为:{0}".format(f(n)))
# 变量作用域
# 局部变量和全局变量
# 所谓局部变量,指的是定义在函数内的变量,只能在函数内使用,
# 它与函数外具有相同名称的其他变量没有任何关系。
# t = 0
# def sum(arg1,arg2):
# t = arg1 + arg2
# print("函数内部是局部变量:",t)
# return t
# sum(10,20)
# print("函数外部局部变量:",t)
# global和nonlocal关键字 当内部作用域想要使用外部作用域的变量时
# global
# num = 1
# def fun():
# global num # 声明全局变量
# num += 1
# print("函数内num的值为:",num)
# return num
# fun()
# print("函数外num的值为:",num)
# nonlocal 在一个嵌套的函数中修改嵌套作用域中的变量
# def outer():
# num = 1
# def inner():
# nonlocal num # nonlocal 关键字声明
# num = 2
# print("inner函数中的num值为:",num)
# inner()
# print("outer函数中的num值为:",num)
# outer()
# 输出 inner函数中的num值为: 2
# outer函数中的num值为: 2
#在inner()函数中使用了 nonlocal 关键字,就会告诉 Python 在 inner() 函数中使用了 outer()函数中的变量 num,对变量 num 进行修改时,会直接影响 outer()函数 中的 num 变量。因此,程序在 inner()函数和 outer()函数中的输出都是 2。
# 匿名函数 lambda 并不是没有名字 而是将函数名作为函数结果返回
# 函数名 = lambad [参数列表]:表达式
# sum = lambda a,b:a+b
# print("和为:",sum(10,20)) # 调用sum函数
# 给定多位学生信息(包括学号、姓名和成绩),按成绩排序后输出
# stu =[
# {"num":1,"name":"xiao hu","score":94},
# {"num":2,"name":"xiao mu","score":93},
# {"num":3,"name":"xiao mi","score":95}
# ]
# stu.sort(key=lambda x:x["score"]) # 用 lambda 函数作为参数 key 的值
# for s in stu: # 在字典中遍历
# print("学号:",s["num"],"姓名:",s["name"],"分数:",s["score"])