函数
一、 函数的定义与调用
思考一:上节课作业我们判断了一个字符串是不是手机号,但是它只能判断一次,如果有很多需要判断怎么办呢?
讯享网
- 函数的定义与调用
讯享网str_a = '' if str_a.isdigit() and len(str_a) == 11: print('ok') else: print('error')
把上面所实现的程序用函数来写
def func_1(phone_number): if phone_number.isdigit() and len(phone_number) == 11: print('这是一个电话号码') else: print('这不是一个电话号码')

讯享网
上面就是定义成函数之后,再调用函数来实现代码的复用
讯享网def function(x,y): print('x is ',x) print('y is ',y) return x + y
def是关键字
function是函数名
括号内是参数
print是不能把打印的内容赋值给变量
return返回的值是可以把值赋值给变量

- 总结
1、定义
掌握:函数的定义方法,def
2、return
掌握:return返回值的意思
3、函数的调用
掌握:函数只有在加上括号之后才会被调用
二、函数的参数
思考一:刚才了解了函数,那么函数有哪些参数呢?
- 函数参数
讯享网def function1(x,y=10,*args,kwargs): print(x) print(y) print(args) print(kwargs)
Python中函数主要有这三种参数:必备参数、默认参数和不定长参数
其中不定长参数有:元组和字典两种类型

必备参数:调用时必须传入
默认参数:调用可以不传入,不传入时默认使用默认参数
不定长参数:可以传入也可以不传入,不传入时默认为空元组和空字典
字典传入时,必须是键值对的形式,且只能最后传入,定义时也只能放在最后面
def function1(x,y=10,*args,kwargs) -> None: print(x) print(y) print(args) print(kwargs)
->None:这个语法是指这个函数的返回值是什么类型,在调用help查看时间可以看到,通常在看Python源码时会见到
拆包:类似于我们之前讲的元组拆包,在传入时也可以通过解包来传入不定长参数

- 总结
1、四种参数
掌握:三种参数形式和调用方法
2、不定长参数
掌握:不定长参数的传入和位置关系
三、函数作用域讯享网
思考一:刚才我们知道了函数可以接受变量值得传入,那么函数会直接改变变量的值吗啊 - 函数作用域
variable = 223 def fun2(var): var += 1 return var

函数不会改变传入的不可变对象的值
函数内部定义的变量在函数外部不可以使用,是局部变量
- 函数作用域-全局作用域
讯享网variable = 223 def fun3(): global variable variable += 1 return variable

如果想要在函数内部改变外面不可变对象变量的值,则需要在函数内部使用global关键字
global是全局变量声明,声明之后可以在全局使用,这里的全局指的是当前py文件中
注意:函数内外名字要一致,否则就是一个新变量
- 函数作用域-局部作用域
def f4(): var1 = 10 def func5(): nonlocal var1 var1 += 1 print('*',var1) return var1 func5() var1 += 2 return var1

如果是嵌套的函数,则不能使用global,需要使用nonlocal关键字
这种情况下遇到比较少,了解即可

- 函数作用域-闭包
讯享网def f4(): var1 = 10 def func5(x): nonlocal var1 var1 = var1 + x print('*',var1) return var1 return func5

把刚才的函数稍微改一下,改f4的返回字为函数func5,调用f4之后的变量值,可以再次调用
把内部函数(func5)和外部变量(var1)都称为闭包
作用:可以在外部修改函数内部的变量值,是函数内部与外界沟通的桥梁
def f6(): live = 50 # 血量 def live_change(blood = None): nonlocal live if blood == None: return live else: live += blood return live return live_change

比如游戏中的血量,是不能任何地方都可以随便修改的,否则随便一个外挂就无敌了
因此需要把血量保护起来,不能随便修改,要修改只能通过调用指定的函数才行,这样就在一定程度上保护了血量
- 总结
1、global
掌握:全局变量
2、nonlocal
掌握:nonlocal的用法
3、闭包
掌握:闭包的定义
四、递归和匿名函数
讯享网思考一:对于需要重复做的事情,我们可以用循环,那除了循环还有其他方法吗? 思考二:求一个阶乘,你会怎么做?
- 递归函数
def recursion(n): if n <= 1: return 1 else: return n * recursion(n-1)

分析一下n=5
5 * (recursion(4) -> 4 * recursion(3))
5 * 4 * (recursion(3) -> 3 * recursion(2))
5 * 4 * 3 * (recursoin(2) -> 2 * recursuon(1))
5 * 4 * 3 * 2 * (recursion(1) -> 1)
5 * 4 * 3 * 2 * 1
递归函数简单来说就是函数内部调用自己,和while循环类似,也需要一个结束条件,否则超出递归深度就会报错
- 匿名函数
讯享网g = lambda x: x + 1

匿名函数就是没有函数名的函数,主要用来定义那种不是特别复杂的函数,常用于函数的参数中

上面的例子中,key参数是可以接受函数的,所以可以直接写成匿名函数
五、本节课总结
1、函数
掌握:函数的定义和调用,返回值
2、函数参数
掌握:函数参数的各种定义和调用
3、函数作用域
掌握:函数作用域的规则和改变方法
4、递归和匿名函数
了解:递归函数的定义和作用
掌握:匿名函数的定义和使用
六、上期作业
参考代码如下
1、找出两个列表中相同元素,并打印出来
讯享网li1 = [1,1,3,'b','a','c',9,9,8] li2 = ['a','b','c','d',1,3,5,7,9] li_one = set(li1) li_two = set(li2) li3 = list(li_one & li_two) print(li3)

2、统计一串字符中,每个字母 a~z的出现次数,忽略大小写
st = input('请输入一段字符串:') st1 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] st2 = {
} for i in st1: if i in st: st2.update({
i:st.count(i)}) print(f'{i}出现的次数为{st.count(i)}') print(st2) for key,value in st2.items(): print(f'{key}出现的次数为:{value}')

讯享网 或者如下代码
st = input('请输入一段字符串:') lt = {
} for i in st: lt[i] = st.count(i) print(lt)

3、利用26个字母和10个数字,随机生成10个8位密码
讯享网import random a = 'abcdefghigklmnopqrstuvwxyz' for i in range(10): b = random.choices(a,k=8) print(f'第{i+1}个8位密码为:',''.join(b))

4、判断用户输入的是不是一个手机号码,并且是不是以13开头的手机号
num = input('请输入您的手机号:') if len(num) == 11 and num.isdigit() == True and num[:2] == '13': print('是13开头的手机号') else: print('不是13开头的号')

讯享网 或者如下
phone = input('请输入您的手机号:') if phone.isdigit(): if len(phone) == 11: if phone[:2] == '13': print("您的手机号是13开头的!!!") else: print("您的手机号不是13开头的!!!") else: print("你输入的不是一个合格的手机号!!!") else: print('您输入的不是一个手机号!!!')

七、作业
1、一个列表由四个元组组成,每个元组都是四个数字组成,现在要求对这个列表排序,排序规则是按照每个元组的第二个元素大小排序
2、实现isPrime()函数,参数是整数,如果整数是质数,返回True,否则返回False
3、利用递归函数,实现一个阶乘函数,支持正数和负数的阶乘
4、定义一个函数,输入字符串,如果字符串是顺序的则返回‘UP’,如果是倒序的则返回‘DOWN’, 如果是乱序的则返回False
讯享网 参考代码下期见!!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/12801.html