Python课堂笔记——函数

函数

函数定义与调用

def student_name(name):			# 函数冒号起始,下面缩进代表以下都是该函数的内容
	"打印学生的名字"				# 相当于函数的注释,解释函数的功能
	print('姓名:', name)
	return {
     '姓名':name}

返回多个值。

def student_name_and_age():
	name = input('请输入姓名\n')
	age = int(input('请输入年龄\n'))
	return name,age

rst = student_name_and_age()		# 默认返回一个tuple
name, age = student_name_and_age()	# 将tuple的值拆分,依次返回至每一个变量

函数的嵌套调用

def worker(s):
	rst = 10 / float(s)
	return rst

def group_leader(s):
	rst = worker(s) * 2
	return rst

def CTO(s):
	return group_leader(s)

参数传递

  • 位置参数
  • 缺省参数
  • 可变参数
  • 关键字参数
  • 命名关键字参数

位置参数

位置参数是最简单的一种函数调用的方式。位置参数须以正确的顺序传入函数,数量必须和声明时的一样。

def student_name_and_age(name, age):
	...

student_name_and_age('叶锴',24)

缺省参数

调用函数时,缺省参数的值如果没有传入,则被认为是默认值。

def student_name_and_age(name, age='不愿透露'):
	...

student_name_and_age('叶锴')
student_name_and_age('赵一默',25)

可变参数

传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个,这些可变参数在函数调用时自动组装为一个tuple。

def all_student_names(*names):
	...

all_student_names('叶锴','赵一默','李默')

关键字参数

允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

def student_info(name, age, **kw):
	print(f'我的名字叫:{name},年龄:{age},其他信息:{kw}')
	if 'city' in kw:
		print(',来自:', kw['city'])

student_info('叶锴', 24, height=187, city='北京')
def score_info(name, **kw):
	if '语文成绩' in kw:
		print(name, '的语文成绩:', kw['语文'])
	if '数学成绩' in kw:
		print(name, '的数学成绩:', kw['数学'])

def person_info(name, age, **kw):
	print('姓名:', name, ',年龄', age)
	score_info(name, **kw)

score_cfg = {
     '语文':89, '数学':95}
person_info('叶锴', 19, **score_cfg)

命名关键字参数

如果要限制关键字参数的名字,可以用命名关键字参数。

def print_person_info(name, age, *, height, weight):		# *号后的参数都叫命名关键字参数
	print(...)

print_person_info('叶锴', 19, height=187, weight=62.5)		# 命名关键字参数调用时必须写清参数名

参数的组合

在定义函数时,可以组合使用以上5种参数。但是,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
注意:最好不要同时组合太多。

def student_info(name, age=18, *books, city, **kw):
	# 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
	...

student_info('叶锴',19, '高数','线代','英语', city='北京', height=187, weight=63)

变量的作用域和global变量

  1. 局部变量 作用域:在函数内
  2. 全局变量 作用域:在函数外
    函数优先使用局部变量,在没有局部变量的情况下,使用全局变量。
    注意:定义在函数内部的变量,函数结束之后自动消亡。
def change_my_name():
	global name			# 当函数中对外面的某一变量赋值时,默认这个变量为局部变量。因此,在赋值前想调用该变量时,需定义global变量,才能调用该变量在外面定义的值
	print('我的名字曾经是', name)
	name = '叶锴'
	print('我的名字现在是', name)

name = '叶君'
change_my_name()

lambda匿名函数

lambda的主体是一个表达式,而不是一个代码块,仅仅能在lambda表达式中封装有限的逻辑进去。
lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。

# lambda 若干个输入参数 : 返回值的表达式
(lambda arg1, arg2: arg1 + arg2)(1, 2)

add = lambda arg1, arg2: arg1 + arg2
add(1, 2)

高阶函数

# 函数名其实就说指向函数的变量
my_print = print
my_print('a')
# 函数名也可以作为一个变量,传入其他函数
def func_x(x, f):
	return f(x)

func_x(-1, abs)			# abs为绝对值函数

一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。

map

map()函数接受两个参数,一个是函数,一个是iterable(可迭代对象)。map将传入的函数依次作用到序列的每个元素,并把结果作为新的iterator返回。

reduce

用传给reduce中的函数function(两个参数)先对集合中的第1、2个元素进行操作,得到的结果再与第三个数据用function函数运算,依此类推,最后得到一个结果。

sorted

默认按照升序排序,当声明reverse=True时降序排序。

装饰器

闭包

闭包从表现形式上定义为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
注意:返回闭包时,返回函数不要引用任何循环变量,或后续会发生变化的变量。

装饰器

用来“装饰”Python的用具,使得代码更具有Python简洁的风格。换句话说,它是一种函数的函数,因为装饰器传入的参数就说一个函数,然后通过实现各种功能来对这个函数的功能进行增强。

# 装饰器输入一个函数,输出一个函数
def print_working(func):
	def wrapper():
		print(f'{func.__name__} is working...')
		func()
	return wrapper

装饰器最大的优势是用于解决重复性的操作,其主要使用的场景如下:

  • 计算函数运行时间
  • 给函数打日志
  • 类型检查
  • 其他重复操作的场景也可类比使用装饰器

偏函数

通过设定参数的默认值,降低函数调用的难度。

你可能感兴趣的:(学习笔记,python)