08. python从入门到精通——自定义函数

本文介绍了Python中函数的创建与调用,包括空函数、正则表达式的应用,以及函数的参数传递机制,如值传递和引用传递。详细讲解了位置参数、关键字参数、默认值、可变参数和关键字可变参数的使用。同时,讨论了函数的返回值,返回值可以是任意类型,可以返回多个值。此外,还涉及到了变量的作用域,包括局部变量和全局变量,以及如何在函数中定义全局变量。最后提到了匿名函数lambda的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数的创建和调用

创建函数:def关键字

语法:
def functionname([parameterlist]):
    ['''comments''']
    [functionbody]
#[parameterlist]:可选参数,用来向函数中传递参数,可以有多个参数使用逗号隔开
#['''comments''']:可选参数,用一对三引号括起来的多行注释,通常用来说明函数的功能和要传递的参数说明等等信息。
	通过这个文档字符串可以自动生成在线文档或打印版的文档。通过:help(函数名)或函数名.__doc__显示。
#[functionbody]:可选参数,用来指定函数体的也就是功能代码
	如果函数有返回值,就可以使用return进行返回
例1:
	空函数:
		def empty():
	  	  pass
例2:创建正则表达式分割函数
	def filter(string):
		'''
		================
		过滤============
		================
		'''
		import re
		pattern = r'[1a]'
		plit = re.split(pattern,string)
		print(plit)
	filter("15032331123ayuikaieo")
	filter?				  	  

参数传递

形式参数和实际参数

形式参数:在定义参数的时候放置的函数的参数为形式参数,例如: def demo(obj)中的obj
实际参数:调用函数时的函数的参数为实际参数

直传递和引用传递

直传递:当实际参数为不可变对象时的参数传递,不改变形式参数的值
引用传递:当实际参数为可变对象时的参数传递,改变形式参数的值
例1:值传递
	aa = "bac"
	print(aa)
	def ff(string):
		string += string
		print(string)
	ff(aa)
	print(aa)
	调用函数前后aa的值不变
例2:引用传递
	aa = "bac"
	bb = list(aa)
	print(bb)
	def ff(string):
		string += string
		print(string)
	ff(bb)
	print(bb)	
	调用函数前后bb的值发生改变

位置参数

是必备参数,定义之后调用函数时必须给定定义的位置参数,位置参数多了或少了或位置不一致都会报错
例:
	aa = ("xiaoming",2,5)
	def nn(name,num1,num2):
		print("name",num1+num2)
	nn("xiaoming",2,5)	

关键字参数:可以打乱参数顺序

例:
	def nn(name,num1,num2):
		print(name,num1+num2)
	nn(num1=2,num2=5,name="xiaoming")	

为参数设置默认值:在指定默认值参数的时候,必须位于所有参数之后

查看默认值:
	print(nn.__defaults__)
例
	def nn(num1,num2,name="xiaoming"):
		print(name,num1+num2)
	nn(2,5)
	nn(2,5,"lisi")

当引用传递时,多次执行时默认值会随之改变,这是可以把默认值设置为None值
例1:默认值会随可变参数发生改变
	def nn(name=[]):
		print(name)
		name.append(1)
	nn()
	nn()
例2:通过None值优化
		def nn(name=None):
		if name == None:
			name=[]
		print(name)
		name.append(1)
	nn()
	nn()

可变参数

*parameter:按位置进行传递可以接受任意多个实际参数,并把它们放到一个元组当中

例1:
	def nn(*zimu):
		for i in zimu:
			print(i)
	nn("a","b")
	nn(1)	
**arameter
例2:可以接受列表
	list = ["a","b","c"]
	def nn(*zimu):
		print(zimu)
		for i in zimu:
			print(i)				
	nn(*list)	
例3:参数为俩列表
	def nn(*shuzi):
		for sz in shuzi:
			for i in sz:
				num = i[0] + i[1]
				print(num)
	list1 = [[1,3],[3,9],[5,7]] 
	list2 = [[2,4],[6,8]]
	nn(list1,list2)	

**parameter:按关键字进行传递,接受多个关键字参数并放在一个字典中

例1:
	def nl(**nianling):
		print(nianling)
		for key,value in nianling.items():
			print("姓名:",key,"年龄:",value)
	nl(xiaoming=18,lisi=22,wangwu=20)	

例2:
	def nl(**nianling):
		for key,value in nianling.items():
			print("姓名:",key,"年龄:",value)
	dict1={'xiaoming':18,'lisi':22,'wangwu':20}
	nl(**dict1) 	

返回值

return

可以用return语句来指定函数返回值,指定的返回值可以是任意类型
可以返回多个值并使用逗号进行分割
如果没有返回值就会返回None值
无论return出现在函数的什么位置都会终止函数
如果不给函数指定返回值,也会返回一个None值
在调用函数时可以把返回值赋值给一个变量,如果返回值数量为一个,变量就保存这一个值;如果返回值数量为多个,变量则以元组形式把这些返回值进行保存

语法:return [value]

例:根据消费价格打折
	def num(money):
		money_old = sum(money)
		if 500 < money_old <= 1000:
			money_new='{:.2f}'.format(money_old*0.9)
		elif 1000 < money_old <= 2000:
			money_new = '{:.2f}'.format(money_old*0.8)
		elif 2000 < money_old <= 3000:
			money_new = '{:.2f}'.format(money_old*0.7)
		elif 3000<money_old:
			money_new = '{:.2f}'.format(money_old*0.6)
		else:
			money_new=money_old
		return money_new,money_old
		
	list=[]       
	while True:
		mon = float(input("请输入价格(输入0表示输入完毕):"))
		if mon == 0:
			break
		else:
			list.append(mon)
	mm = num(list)    
	print(mm)

变量的作用域

变量的作用域:是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出现错误

局部变量:是指在函数内部定义并使用的变量,在函数提外会抛出NameErorr错误

例:
	def name():
		AA_1 = "名字"		#定义局部变量
		print(AA_1)	#函数内部调用变量
	name()
	print(AA_1)		#函数外部调用会报错

全局变量:能够作用域函数内部和外部的变量,不能再函数体内改变全局变量,如果改变就等于在函数体内又定义了一个局部变量

例:
	AA_1 = "名字A"	#定义全局变量
	def name():    
		print(AA_1)
	name()
	print(AA_1)	

在函数体内定义全局变量用global关键字

例:
	def name(): 
		global AA_1 	#修饰为全局变量
		AA_1 = "名字"
		print(AA_1)
	name()
	print(AA_1)	

匿名函数

匿名函数:在python中通常只使用一次所以不用取名,可以使用lambda表达式来实现匿名函数

语法:输出一个lamdba对象
	reslut = lamdba [arg1[,arg2,arg3,...,argn]]:expression
		#arg:定义的参数会在后面表达式中被引用
		#expression	#在这个表达式中不能出现for或者while非表达式语句

例1
	import math
	r = 10
	result = lambda r:math.pi*r*r
	print(result(r))

例2:
    bookinfo = [('不一样的卡梅拉(全套)',22.50,120),('零基础学Python',65.10,79.80),('摆渡人',23.40,36.00),('福尔摩斯探案全集8册',22.50,128)]
    print('爬取到的商品信息:\n',bookinfo,'\n')
    bookinfo.sort(key=lambda x:(x[1],x[1]/x[2]))    # 按指定规则进行排序
    	#x:表示传入的列表中的元组
    	#(x[1],x[1]/x[2]))表示先通过元组中的第二项升序排序,如果相同在通过元组中的第二项除以第三项升序排序
    print('排序后的商品信息:\n',bookinfo)	
### 学习Python编程的完整路径 对于初学者来说,了解Python的基础概念至关重要。阅读《BeginnersGuide/Overview》可以获取关于Python是什么以及其特性的简短介绍[^3]。 尝试一些简单的实验有助于熟悉新安装的Python解释器环境。如果从未有过编程经验,《BeginnersGuide/NonProgrammers》提供了适合新手的学习资源列表,这些资料能够帮助建立初步的知识体系并掌握基本语法结构[^1]。 为了更高效地学习Python,遵循一种被广泛认可的方法——实践驱动型学习非常有益。这意味着不仅要阅读理论知识,还要动手编写代码来解决问题。通过这种方式,可以从实践中加深理解,并逐步提升技能水平至高级阶段[^2]。 #### 初级到中级过渡的关键知识点 - **数据类型与变量** 掌握如何定义不同类型的变量(整数、浮点数、字符串等),这是任何程序设计语言中最基础的部分之一。 - **控制流语句** 使用条件判断(if...elif...else)和循环(for, while),可以让程序根据不同的情况执行相应的操作。 - **函数定义** 函数是一段可重复使用的代码片段,它接受输入参数并返回处理后的结果。学会创建自定义函数能极大提高代码复用性和模块化程度。 - **错误处理机制** 编写健壮的应用程序离不开良好的异常捕获能力。try-except-finally块可以帮助开发者优雅地应对运行时可能出现的各种意外状况。 ```python def divide(a, b): try: result = a / b except ZeroDivisionError as e: print(f"Error: {e}") return None finally: print("This will always execute.") return result ``` #### 中级向高级迈进的技术要点 - **面向对象编程(OOP)** OOP是一种强大的编程范式,允许程序员构建复杂的数据模型并通过类(class)的形式封装属性(attribute)和方法(method)。深入研究OOP特性如继承(inheritance)、多态(polymorphism)可以使开发更加灵活且易于维护。 - **文件I/O操作** 处理外部存储设备上的文件是许多应用程序的核心功能之一。熟练运用open()函数读取或写入文本文件和其他二进制格式的内容是一项必备技能。 - **正则表达式(Regex)** Regex提供了一种简洁而强大模式匹配工具,在解析日志记录、验证用户输入等方面有着广泛应用场景。精通regex将使解决这类问题变得轻而易举。 - **网络爬虫(Web Scraping)** 当今互联网时代下,从网页上提取有价值的信息成为一项热门需求。利用库比如BeautifulSoup或者Scrapy框架抓取公开可用的数据集既有趣又实用。 - **数据库交互(SQLAlchemy ORM)** SQLAlchemy是一个流行的SQL工具包及ORM(Object Relational Mapper), 它简化了Python应用同关系型数据库之间的连接过程。借助于这种映射技术,可以直接操纵表单中的实体而不必担心底层SQL查询细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值