概述
函数
一、 函数的定义与调用
思考一:上节课作业我们判断了一个字符串是不是手机号,但是它只能判断一次,如果有很多需要判断怎么办呢?
- 函数的定义与调用
str_a = '13323235656'
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 = 'abcdefghigklmnopqrstuvwxyz1234567890'
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
参考代码下期见!!!
最后
以上就是阔达铃铛为你收集整理的Python全栈最全学习之路-Python基础(五)的全部内容,希望文章能够帮你解决Python全栈最全学习之路-Python基础(五)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复