python函数

函数

一、定义

1、概念

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段

2、基本语法

def functionname( parameters ):
   "函数_文档字符串"
   function_suite
   return [expression]

3、定义函数时的简单规则

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明
  • 函数内容以冒号起始,并且缩进
  • return [表达式] 结束函数,选择性地返回一个值给调用方,可以返回任何的数据类型。返回多个值的时候,往往返回的是tuple类型,不带表达式的return相当于返回 None

二、函数的调用

1、参数

  • 位置参数
    根据位置进行参数的传递,不可缺少
def test(a,b):
   return a*b

res = test(2,4)
  • 关键字参数
    对参数的关键字进行传入,使用关键字参数允许可定义参数的位置进行调换,需要注意的是,位置参数必须在关键字参数的左侧
def test(a,b,c):
   return a*b*c

>>> test(2,c=3,b=6)
36
  • 默认参数
    默认参数往往指的是在定义函数的时,给参数定义一个默认的值,这样在调用函数时,如果不传入参数,则会使用默认的值。
def test(str1="hello",str2="python"):
	print("{str1},{str2}".format(str1=str1,str2=str2))

>>> test()
hello,python
  • 不定长参数
    可以让函数接收多个参数,不定长参数在定义时不需要命名,定义方法:def functionname([formal_args,] *args,**karg ):
    arg会将多个参数以tuple形式返回,kwargs则以dict形式返回
def test(x,*args,**kwargs):
	print(x)
	print(args)
	print(kwargs)
	
>>> test(1,111,22,3,k1=1,k2=2)
1
(111, 22, 3)
{'k2': 2, 'k1': 1}

三、变量的作用域

变量的作用域即是变量的访问范围,也叫做命名空间,第一次给变量赋值的位置决定了变量的作用域。

1、全局变量

定义在文件顶层的变量,整个程序中都能进行调用,一般以大些字母定义变量名

NAME = "wind"
def test():
	print(NAME)
test()
结果:wind #当函数在本地域找不到变量时就会调用全局变量
NAME = "wind"
def test():
	NAME = "storm"
	print(NAME)
test()
print(NAME)
结果:storm wind 
#当作用域内的变量和外部变量重名时,会遵循本地优先原则,但并不会影响外部的变量
NAME = [ "wind","kingdom" ]
def test():
	NAME.append("storm")
	print(NAME)
test()
print(NAME)
结果:[ "wind","kingdom","storm"] 
     [ "wind","kingdom","storm"]
#若全局变量为列表这种可变类型的数据,则即使在没有声明全局变量的情况下也会被改变
  • global语句
    在函数内部域声明局部变量为全局变量
NAME = "wind"
def test():
	global NAME
	NAME = "storm"
	print(NAME)
test()
print(NAME)
结果:storm storm 

2、局部变量

只在函数内部有效调用的变量,在相应作用域外部无法被调用。

def test():
	a = 10
	def show():
		a = 20
	print(a)
结果:10 #a=20为show函数作用域的局部变量,无法被test()函数调用
  • nonlocal语句
    nonlocal声明的变量,若没有被赋值,则该变量则就是上层函数的本地变量。
def test():
	a = 10
	def show():
		nonlocal a
		b = 30
		c = a + b
		print(c)
	show()
test()
结果:40

3、函数作用域的小例子

此例子说明的是,函数的作用域是在定义函数的时候划分的,和在何处调用此函数没有关系

name = "god"
#当定义一个函数时,相当于把一段代码字符串写入内存中
def foo():
	name = "hyj"
	def bar():
		print(name)
	return bar 

foo() #返回值为bar函数的内存地址
res=foo()
print(res()) #加上"()"代表运行此内存地址储存的代码块

运行结果:
hyj
None
#还有一个none的值是因为bar函数没有设定返回值,因此答应的时候默认值为None

四、函数的递归

1、函数的递归需要的条件

  • 必须要有一个明确的结束条件
  • 每次进入更深一次递归时,问题规模都会比上一次有所减少

递归的效率不太高,递归层数过多会导致堆栈溢出(在计算机中,函数调用是通过栈这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈,每当函数返回,则会减一层栈。由于栈的大小不是无限的,因此如果调用次数过多,回导致栈溢出)

2、一个简单的递归函数

def calc(n):
	print(n)
	if int(n/2) == 0: #设定结束条件
		return n
	res=calc(int(n/2)) #
	return res

五、匿名函数

1、格式

lambda 形参;函数返回值

2、简单使用

add = lambda x,y:x+y
print(add(3,4))
结果:
7
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值