Python全栈最全学习之路-Python基础(五)

函数

一、 函数的定义与调用

	思考一:上节课作业我们判断了一个字符串是不是手机号,但是它只能判断一次,如果有很多需要判断怎么办呢?
  • 函数的定义与调用
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

	参考代码下期见!!!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值