函数和函数式编程

Python 核心编程[第十一章]

0x00函数

过程常常指没有返回值的可被调用的实体,然而函数则与之不同,常常指有返回类型的可调用实体。在 Python 中,说有的函数都有返回值,即使它没有明确的指出返回值,此时它会返回 None。不过 Python 也可以返回一个或多个对象,当返回多个对象时,实质上也是返回了一个对象,该对象是返回的多个对象组成的一个元组。

0x01函数定义

一、函数创建

1.def 语句
	def xxx():
		"xxxxxx"
		print()
   #"关键字" 函数名 函数操作符(参数集合):
   #文档字符串
   #函数体  属性以及函数语句  
2.传递函数

函数可以被当作一个对象赋值给一个变量,并且也可以把函数名赋值给另一个变量达到给该函数取别名的效果,函数也可以被当作其他函数的参数进行传递。

二、参数

1.位置参数

在函数调用进行参数传递时,必须严格按照函定义中的参数的位置以及个数进行相应的传递,否则则会出现错误。位置参数必须放置在关键字参数之前。

2.默认参数

默认参数是声明了默认值的参数。并且在函数调用时,也可以不向该参数传值。

  # 例:
  def A(a = 111,b):
	  print(a+b)
3.关键字参数

关键字参数概念只针对函数的调用,用给函数参数赋值的方式进行函数调用。

  #例:
  def A(a,b):
	  print(a+b)
  A(a=1,b=2) 
  A(b=1,a=2) #这样写也不会出错
4.参数组

Python 允许执行一个没有显示定义参数的函数,相应的方法是通过一个把元组或字典作为参数组传递给函数。在函数声明中使用 * 和 ** 符号来指定元组和字典的元素作为非关键字以及关键字参数的方法。

# 这里只是给出了声明形式,这样写在调用 print 时可能出现错误,请自行修改
# 可变长的参数元组必须在位置参数和默认参数之后
  # 元组类型
  def A(arg1 ,arg2 ,*arg):
	  print(arg1,arg2,arg)
  # 字典类型  ** 必须在 * 后边定义
  def B(arg1, **arg):
	  print(arg1,arg.key,arg[arg.key])
  def C(arg, *arga, **argb):
	  pass
  C(1,*(1,2),**{1,'A',2,'B'})
  a = (1,2)
  b = {1,'A',2,'B'}
  C(1,*a,**b)

三、内嵌函数

在函数体内创建另一个函数是合法的,这种函数叫做内嵌函数。

  def A():
  	def B():
  		print('xxxxx')
  	B()

0x02函数式编程

Python 提供的以四种内建函数和 lambada 表达式的形式出现。

一、匿名函数与 lambda

  lambda [arg1[,rag2, ... argN]]:expression

Python 允许用 lambda 关键词创造匿名函数。匿名是因为不需要以标准的方式来声明,比如使用 def 语句。作为函数,它们也有参数。一个完整的 lambda “语句”代表了一个表达式,这个表达式的定义体必须和声明放在同一行。

def true():return True <=> lambda :True
匿名函数的使用:
	xxx = lambda:True
def add(x,y):return x+y <=>lambda x,y:x+y

二、内建函数 apply()、filter()、map()、reduce()

这些函数提供了在 Python 中可以找到的函数式编程的特征。lambda 函数可以很好的和使用了致谢函数的应用程序结合起来,因为它们都带了一个可执行的函数对象,lambda表达式提供了迅速创造这些函数的机制。

1.filter()
  filter(fun,seq)

对给定的一个序列通过指定函数进行筛选,并返回符合指定函数条件的一个新的序列(满足该条件的原序列中的元素组成的新的序列)。

 # 例:选出偶数
 	from random import randint
 	Nums = []
 	for Num in range(9):
 		Nums.append(randint(1,99))
 	print(filter(lambda n:n%2,Nums))
 # 由于列表解析特别方便所以也可以写成下列形式
 from random import randint as r
 print([n for n in[r(1,99) for i in range(9) if n%2]])
2.map()
map(func,seq1[,seq2...])

对给定的一个序列通过指定函数进行改变,并返回通过指定函数改变后的新序列。当 func 为 None 时,seq 为单个时,返回的时原序列。当 func 为多个时,返回的是多个序列对应元素组成的元组形成的新序列。

  zip(a,b) <=> map(None,a,b)
3.reduce()
  A = [a,b,c,d]
  def func(): xxx
  
	reduce(func,A) 
<=>
	func(func(func(a,b),c),d)	

0x03变量作用域

一、全局变量与局部变量

1.全局变量

全局变量的一个特征是除非被删除掉,否则它们存活到脚本运行结束,且对于所有的函数,它们的数值都是可以被访问的。

2.局部变量

局部变量就像暂存在栈中,只是暂时存在,仅仅依赖于它们的函数现阶段是否处于活动。当一个函数调用出现时,其局部变量就进入声明它们的作用域。即,在被调用的那一时刻局部变量被创建,调用完成,局部变量离开作用域。

二、globa语句

如果将全局变量的名字声明在一个函数体内的时候,全局变量的名字能被局部变量给覆盖掉。即、在函数内部想要更改全局的变量时,在函数内部定义一个相同变量名的变量,对函数内部定义的变量进行修改不会对全局变量造成影响。
所以,在函数内部想要对全局变量进行修改时可以在函数内部如下定义:

	A = 123
	def a():
		folba A
		A = A +1
	# 这样定义便会对 A 进行改变。

三、lambda 作用域

lambda 匿名函数中的变量作用域同普通函数中的变量的作用域是相同的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值