1、函数的意义
在编写代码时,经常会遇到重复进行代码编写的情况,通常是某一完整的动作或者行为,那么可以把这部分功能相似的代码封装起来,写成函数,这样可避免代码冗余,同时方便代码块的重复使用。
python中已经有很多内建的函数,比如print()、max()等,这里我们主要记录的是自己创建的函数,自定义函数。
2、定义一个函数
定义函数的规则如下:以def关键字开头,紧跟函数名称和()和冒号;
小括号()内传入参数,可传多个或者不传;
冒号后换行、缩进,开始函数体;
return用户返回函数结果,无return默认不返回。def funtion_name(parameters):
函数体
return()
函数的调用即执行函数操作,语法如下:[返回值] = 函数名([实参值])
栗子1: 定义一个筛选列表中所有偶数的函数
def even_list(list_param):
even = []
for i in list_param:
if i%2==0:
even.append(i)
return(even)
l1=[1,2,3,4,5,6,7,8,9]
even_l1 = even_list(l1)
栗子2:定义一个判断是否是素数的函数
num = int(input("请输入一个正数:"))
def prime_isnot(num):
if num < 2:
print('请传入大于2的自然数')
return
for i in range(2, num):
if (num % i == 0):
print("%d不为素数" % num)
break
else:
print("%d是素数" % num)
prime_isnot(num)
这里例子都是用了return来返回函数结果。
关键字return的作用:返回函数结果值;
终止一个函数的继续;
实参和形参:形参:定义函数时传递给函数的变量,并没有实际意义,也没有内存空间,如栗子1中的list_param
实参:调用函数时传递实际变量成为实参,实际变量是有内存的,比如栗子1中的l1列表
另外,定义函数时是可以传递多个参数的,多个参数可以按照位置、参数名称来进行传递。
栗子3
def square_sum(a, b):
return((a+b)**2, a**2 + b**2)
sum1 = square_sum(2,3)
sum2 = square_sum(a=2,b=3)
sum1 # (25 ,13)
sum2 # (25 ,13)
默认参数:
在定义函数式,直接给形式参数赋值,当调用函数时,如果默认参数没有传入,则采用默认值。
def printUserInfo(name, gender, age = 35 ):
print("name:",name)
print("gender:",gender)
print("age:",age)
printinfo(name='Lily',gemder='Male',age=45) # age=45
printinfo(name='Lilei',gemder='Famale') # age=35 采用默认值
3、函数与变量的作用域
全局变量/函数:作用域在于整个类空间内
a, b = 1, 2 # 全局变量
print(a,b)
def func1():
# 由于a,b是全局变量,函数内仍然可以访问到
print(a+b)
func1()
局部变量/函数:一般作用域局部函数内
a=1 # 全局变量
def func1():
c=3 # 局部变量,只在函数体内可以访问到
print(a+c)
func1()
print(c) # 访问不到
无论是全局或者局部变量/函数,都作用与与自己平行的或者向内的空间内
a=1 # 全局变量
def func1():
c=3 # 局部变量,只在函数体内可以访问到
print(a+c)
def func2(): # 该函数定义在函数内,与变量一样,在同级或者向下访问,func1外访问不到
d=1 # 局部变量,在func2外访问不到
print(c) # 可以访问,因为函数2在函数1之内,向下访问
func2() # 函数必须调用才可运行
func1()
就近访问原则
# 变量/函数 均是访问最内层的。
a=1
def func1():
a=2
print(a) # a=2
func1()
print(a) a=1
总结:变量/函数 均是同级或者向下访问,一般不可向上访问。
4、匿名函数
匿名函数:是指当函数实现比较简洁,且不会频繁调用,利用lambda来声明匿名函数,这种匿名函数是没有名字的,是临时使用。函数对象名 = lambda 形式参数:表达式
匿名函数单独使用的情况不是很常见,通常与一些高阶函数使用,比如apply、map、filter、reduce函数。
filter函数
filter函数过滤掉序列中不符合函数条件的元素,筛选元素。 语法:filter(function,sequence),function为匿名函数或自定义函数,返回函数条件为True的元素组成的迭代器。
lis = [1, 2, 3, 4, 5, 6, 7, 8]
re = filter(lambda x: x % 2 == 0, lis)
print(list(re)) # [2,4]
# 过滤字母以B开头的人名。
names = ['Alice','Bob','Smith','David','Barbana']
list(filter(lambda x: x.startswith('B'),names)) # ['Bob', 'Barbana']
map函数
map函数是将一个或多个序列作用与函数,并返回函数映射的值的迭代器。语法map(function,sequence),function中的参数值可传多个,后面的sequence与函数传入参数对应。
lis = [1, 2, 3]
result = map(lambda x: x*2, lis)
print(list(result)) # [2, 4, 6]
x = [1,2,3,4,5]
y = [2,3,4,5,6]
list(map(lambda x,y:(x*y)+2,x,y)) # [4, 8, 14, 22, 32]
reduce函数
reduce函数是对序列进行压缩运算,语法reduce(function,iterable),function须传入两个参数,最后返回函数结果。reduce在functools模块之中,需导入使用。
from functools import reduce
arr = [2,3,4,5,6]
reduce(lambda x,y: x + y, arr) # 直接返回一个值 20(连加)
product = reduce((lambda x, y: x * y), [1, 2, 3, 4])
product # 24(连乘)
其实,这里所讲述map和filter都是python内建函数,且实现功能可以使用列表推导式代替。
apply函数
apply函数是pandas中的函数,应用对象为pandas中的DataFrame或者Series。语法apply(function,axis),axis表明对行或者列做运算。应用方式:直接应用在DataFrame或者Series对象上;
应用在pandas中的groupby之后的聚合对象
import pandas as pd
import numpy as np
a = np.random.randint(low=1,high=5,size=(2,4)) # 2行4列
data = pd.DataFrame(a, columns=list('abcd'))
data
data.apply(lambda x:x*10)
data['a'].apply(lambda x:x*10)
# data['a'].map(lambda x:x*10)也可以,pandas模块也有map函数
小结:filter和map都是内置函数,reduce在functools模块,apply在pandas模块(pandas模块也有map函数)
过滤删减序列用filter;要对多个序列做函数运算用map;在pandas里面用apply。
这里主要是介绍lambda函数的应用,对于apply和map对DateFrame的操作后续将详细进行学习记录。