Python零基础速成班-第5讲-Python函数,Function和Lambda基础

学习目标

  1. Function函数
  2. Lambda Function函数
  3. 课后作业(4必做)

友情提示:将下文中代码拷贝到JupyterNotebook中直接执行即可,部分代码需要连续执行。

1、Function 函数

函数的定义:

  1. 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码块。
  2. 函数能提高应用的模块性,和代码的重复利用率。
  3. 函数可以接受任意数量和类型的输入参数,并返回任意数量和类型的输出结果。

1.1Python中函数的规则:

  1. 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
  2. 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  3. 函数内容以冒号起始,并且缩进。
  4. return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
  5. 函数必须经过调用才能运行。

不做任何事情的空函数,pass表示函数不做任何操作

def do_nothing():pass
type(do_nothing)
function

函数只有在调用的时候才会执行

def output():print("hello world!")output()
hello world!

一个没有参数和返回值的函数

def greeting():print("这是一个没有参数和返回值的函数!")a = greeting()
这是一个没有参数和返回值的函数!

没有参数且返回布尔值的函数

def im_handsom():return Trueif im_handsom():print("yes,you are so handsom")
else:print("hehe")
yes,you are so handsom

带有参数但不返回任何内容的函数

def greeting(name):print("hello %s"% name)#调用函数
greeting("Lily")
hello Lily

带有参数和返回值的函数

def greetingwithre(name):return "hello " + nameprint(greetingwithre("Lily"))
hello Lily

1.2 函数的参数

  1. 参数分为形参(形式参数)和 实参(实际参数)。
  2. 形参又分为:位置参数、关键字参数、默认参数、可变参数。
  3. 形参是在定义函数的时候给出的。
  4. 实参是在调用函数的时候给出的。

1.2.1 Positional Arguments 位置参数

位置参数是指其值按顺序复制到相应的参数中。

def students_info(age1,age2,age3):return {"lily":age1,"adam":age2,"sam":age3}students_info(18,20,25)
{'lily': 18, 'adam': 20, 'sam': 25}

1.2.2 Keyword Arguments 关键字参数

为了避免位置参数混淆,您可以通过相应参数的名称来指定参数,即使顺序与函数中的定义不同,也可以保证参数传入的正确性。

def students_info(age1,age2,age3):return {"lily":age1,"adam":age2,"sam":age3}students_info(age3 = 30,age2 = 20, age1 = 18)
{'lily': 18, 'adam': 20, 'sam': 30}

1.2.3 Default Parameter Values 默认参数

如果调用者不设置参数的传入值,可以为参数设置默认值。
dessert = “pudding”,调用者不设置参数的传入值,则使用默认值。

def menu(wine,entree,dessert = "pudding"):return {"wine":wine,"entree":entree,"dessert":dessert }
menu("mojito","chicken")
{'wine': 'mojito', 'entree': 'chicken', 'dessert': 'pudding'}

如果调用者提供值,则默认值将被覆盖。
调用者设置参数的传入值"cake",则默认值"pudding"被覆盖。

def menu(wine,entree,dessert = "pudding"):return {"wine":wine,"entree":entree,"dessert":dessert }
menu("mojito","chicken","cake")
{'wine': 'mojito', 'entree': 'chicken', 'dessert': 'cake'}

1.2.4 Gather Positional Arguments with * ,带*号的位置参数

*args实现传入参数以元组(tuple)的形式提供给函数,格式为tuple,多值。

def print_arg(*args):print("positinal args:",args)print_arg(1,2,3,4,4)
positinal args: (1, 2, 3, 4, 4)

函数会自动匹配传入参数,并将剩下的多值变为tuple

def print_requried_args(r1,r2,*a):print("r1:",r1)print("r2:",r2)print("args:",a)print_requried_args(1,2,3,4,5,6,7)
r1: 1
r2: 2
args: (3, 4, 5, 6, 7)

1.2.5 Gather Positional Arguments with ** ,带**号的位置参数

**kwargs实现传入参数以字典(dict)的形式提供给函数,格式为dictionary,键值对多值。

def print_kwargs(**kwargs):print("keywords args:", kwargs)print_kwargs(first = 1, second = 2)
keywords args: {'first': 1, 'second': 2}

函数会自动匹配传入参数,并将剩下的多值变为tuple和dict

def print_all_args(req1,*args,**kwargs):print("required arg1:",req1)print("positional args:",args)print("keyword args:",kwargs)
print_all_args(1,2,3,4,5,name = "Lily",gender = "female")
required arg1: 1
positional args: (2, 3, 4, 5)
keyword args: {'name': 'Lily', 'gender': 'female'}
def print_all_args(req1,option = "choose",*args,**kwargs):print("required arg1:",req1)print("option arg1:",option)print("positional args:",args)print("keyword args:",kwargs)
print_all_args(1,2,3,4,5,name = "linda")
required arg1: 1
option arg1: 2
positional args: (3, 4, 5)
keyword args: {'name': 'linda'}

1.3 函数嵌套

在一个函数中定义了另外一个函数,参数按照先后顺序传入
如下例:square = exp_factory(3)表明n=3,square(2)表明a=2,最后执行2**3

def exp_factory(n):def exp(a):return a**nreturn expsquare = exp_factory(3)
square(2)
8

exp_factory(2)(3)表明先传入参数2,即n=2,后传入3,即a=3,最后执行3**2

def exp_factory(n):def exp(a):return a**nreturn expexp_factory(2)(3)
9

1.4 函数作用域

1.局部变量
在函数内部定义的变量,只在函数内部起作用,函数执行结束后变量会自动删除。
2.全局变量
与局部变量对应,全局变量为能够作用于函数外的变量。

进阶提示:
全局变量主要有以下两种:
如果一个函数在函数体外定义,那么不仅仅在函数外可以访问到,在函数内部也可以访问到。
如果一个变量在函数体内部定义,并且是以global关键字修饰后,该变量也就成为全局变量函数体外也可以访问此变量。

局部变量,仅作用于函数内部

a=1
def fun():a=5print(a)print(a)
fun()
1
5

加入globe关键字后变为全局变量

a=1
def fun1():global aa=5print(a)fun1()
print(a)
5
5

1.5类型注解提示

name:str 传入参数类型
->str 返回值类型

def funtips(name : str) -> str:   return "Hello " + name
funtips("Tom")
'Hello Tom'

也可以直接说明传入参数类型和函数返回类型

def funtips1(num:"传入数字",n:"传入数字的几次方") -> "返回数字的n次方":   return num**n
funtips1(5,3)
125

2、Lambda函数

Lambda函数,即Lambda 表达式(lambda expression),是一个匿名函数(不存在函数名的函数),lambda和普通的Function函数相比,就是省去了函数名称而已。

我们可以把Lambda理解为小号精简版的Function函数,它有如下优点:

  1. 使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。
  2. 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。
  3. 使用lambda在某些时候让代码更容易理解。
double = lambda a:a*2
double(2)
4

[2]为数组中第几个lambda函数 (2)为函数传入值x

many_function = [lambda x: x**2,lambda x: x**3,lambda x: x**4,
]
many_function[2](2)
16

[1]为字典中key值为1的lambda函数 (6)为函数传入值x

many_function_dict = { 1: lambda x: x**2,2: lambda x: x**3,3: lambda x: x**4
}
many_function_dict[1](6)
36

**x实现传入参数以字典(dict)的形式提供给函数,格式为dictionary,键值对多值。

double = lambda **x: print(x)
double(a=1,b=2,c="good")
{'a': 1, 'b': 2, 'c': 'good'}

*x实现传入参数以元组(tuple)的形式提供给函数,格式为tuple,多值。

double = lambda *x: print(x)
double("a","b","c",1,2)
('a', 'b', 'c', 1, 2)

2.1 filter()

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新数组。

进阶提示:filter( )返回值为list数组,可以用list( )方法接收。

下例为从my_list数组中筛选偶数并返回成新数组

my_list = [1,2,3,4,5,6,7,8,9]
new_list = list(filter(lambda x:x%2 == 0, my_list))
new_list
[2, 4, 6, 8]

从1-11中筛选奇数并返回成新数组list3

list2 = [i for i in range(11)]
list3 = list((filter(lambda x:x%2 == 1,list2)))
list3
[1, 3, 5, 7, 9]

延申应用,从原数组中选取偶数并生成新数组,我们这里使用Numpy生成一个新数组[0,1,2,3…29]

import numpy as np
numlist = np.arange(30)
[i for i in numlist if i%2 == 0]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]

以上语法等同于下例通过循环的方式来筛选偶数,明显比下例要简洁

new_list = []
for i in numlist:if i%2 == 0:new_list.append(i)
new_list
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]

快速过滤以下数组中长度小于1的(在爬虫数据处理中很有用)

strlist=["!","我的","明","家乡在","人","。","今","北京"]
[word for word in strlist if len(word) > 1]
['我的', '家乡在', '北京']

2.2 map()

map()会根据提供的函数对指定序列做映射,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
map(function_to_apply,list_of_inputs)

进阶提示:map( )返回值为list数组,可以用list( )方法接收。

items = [1,2,4,6,7]
squared = []
for i in items:squared.append(i**2)
squared
[1, 4, 16, 36, 49]

使用map函数快速实现将数组所有元素做2次方操作

items = [1,2,4,6,7]
squared = list(map(lambda x: x**2, items))
squared
[1, 4, 16, 36, 49]

进阶方法,也可以使用Numpy快速实现

import numpy as np
squared1 = np.array([1,2,4,6,7])**2
print(squared1)
[ 1  4 16 36 49]

设置体重、身高、年龄三个数组,分别带入函数basic_metabolic_rate_female中,计算女生基础代谢率,保留2位小数

def basic_metabolic_rate_female(weight,height,age):return ("%.2f" %(661+9.6*weight+1.72*height-4.7*age))
weightl = [67,57,67]
height1 = [1.67,1.67,1.67]
age1 = [31,31,21]bmr = map(basic_metabolic_rate_female,weightl,height1,age1)
list(bmr)
['1161.37', '1065.37', '1208.37']

使用map加lambda语法,快速实现上述功能

weightl = [67,57,67]
he1 = [1.67,1.67,1.67]
age1 = [31,31,21]
basic_metabolic_rate = list(map(lambda w,h,a:"%.2f" %(661+9.6*w+1.72*h-4.7*a),weightl,he1,age1))
basic_metabolic_rate
['1161.37', '1065.37', '1208.37']

可以将函数写入数组中,用map函数实现多个函数同时执行效果

def multiply1(x):return x*x
def add1(x):return x+xfunc1 = [multiply1,add1]for i in range(5):print("i =",i)values = list( map(lambda x:x(i),func1) )print(values)
i = 0
[0, 0]
i = 1
[1, 2]
i = 2
[4, 4]
i = 3
[9, 6]
i = 4
[16, 8]

2.3Reduce

reduce() 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
reduce(function, iterable[, initializer])

返回x+y,即依次将数组内的元素相加

from functools import reduce
reduce(lambda x,y: x+y, [1,11,22,33,44])
111
sum([1,11,22,33,44])
111

a,b: a if (a>b) else b,即依次循环求该数组最大值

max_num = lambda a,b: a if (a>b) else b
reduce(max_num,[1,4,6,-1,111,90])
111

3、课后作业,答案在下一讲

1、编写一个名为make_shirt() 的函数,传入参数为size+logo(默认值是"ilovechina"),这个函数应打印一个句子,说明T恤的尺码和字样。使用位置形参或关键字形参分别调用该函数。

您的代码:

2、已知一个数列:1、1、2、3、5、8、13、……,其规律为从第3项开始,每一项都等于其前两项的和,这个数列就是斐波那契数列。请求出符合斐波那契数列规律的第(27)项的值。

您的代码:

3、通过lambda和map方法设计一个男女宝宝身高预测计算器,公式为

女:(男+女)2女:\frac{(男+女)}{2}女:2(男+女)​
男:(男+女)2∗1.08男:\frac{(男+女)}{2}*1.08男:2(男+女)​∗1.08

并为以下组合计算宝宝预测身高(假设男宝宝1,女0):性别[1,0,1,0]父亲身高[175,180,172,178]母亲身高[160,165,159,162] 。

您的代码:

4、通过lambda和reduce的方法设计一个程序寻找随机数组(20个0~100)中的最小值。

您的代码:

4、上一讲Python零基础速成班-第4讲-Python基础(下),结构语句、循环 课后作业及答案

1、做一个简单的猜数字游戏(0-30内), 随机生成一个数字,给5次机会猜中,猜大猜小均有提示,5次机会后,游戏宣布结束。

import random
stery = random.randint(0,30)
times= 5
for i in range(1,times+1):userinput = int(input("Please enter a number between 0~30:\n>>>"))if userinput == stery:print("Great,you are right,the number is %s!" % stery)break elif userinput > stery:print("Your input is too big!\nYour have %s times left,Good luck!" %(times-i))else:print("Your input is too small!\nYour have %s times left,Good luck!" %(times-i))
print("Game Over...")
Please enter a number between 0~30:
>>>15
Your input is too small!
Your have 4 times left,Good luck!
Please enter a number between 0~30:
>>>22
Great,you are right,the number is 22!
Game Over...

2、统计"I have a dream that one day this nation will rise up and live out the true meaning of its creed: We hold these truths to be self-evident, that all men are created equal." 每个英文字符出现的次数

str = "I have a dream that one day this nation will rise up and live out the true meaning of its creed: We hold these truths to be self-evident, that all men are created equal."
print({i:str.count(i) for i in set(str)})
{'m': 3, 'w': 1, 'c': 2, ':': 1, 'n': 8, 'b': 1, 'q': 1, '-': 1, 'e': 22, 'l': 8, 'd': 7, ',': 1, 'i': 8, ' ': 33, 'r': 7, 'W': 1, 'v': 3, '.': 1, 'p': 1, 'g': 1, 'y': 1, 'h': 8, 's': 6, 'f': 2, 'a': 13, 't': 16, 'I': 1, 'o': 6, 'u': 5}

3、打印9*9乘法表

for i in range(1,10):line=""for j in range(1,i+1):line+="{}*{}={}  ".format(j,i,j*i)print(line)
1*1=1
1*2=2  2*2=4
1*3=3  2*3=6  3*3=9
1*4=4  2*4=8  3*4=12  4*4=16
1*5=5  2*5=10  3*5=15  4*5=20  5*5=25
1*6=6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

Python零基础速成班-第5讲-Python函数,Function和Lambda基础相关推荐

  1. Python零基础速成班-第9讲-Python面向对象编程(上),对象和类、初始化、继承、重写、多态、类方法、组合

    Python零基础速成班-第9讲-Python面向对象编程(上),对象和类.初始化.继承.重写.多态.类方法.组合 学习目标 修饰器 面向对象编程:对象和类.初始化.继承.重写.多态.类方法.组合 课 ...

  2. Python零基础速成班-第13讲-Python正则表达式Regex

    Python零基础速成班-第13讲-Python正则表达式Regex 学习目标 正则表达式 课后作业(4必做) 友情提示:将下文中代码拷贝到JupyterNotebook中直接执行即可,部分代码需要连 ...

  3. Python零基础速成班-第10讲-Python面向对象编程(下),Property属性、特殊方法、设计模式、链表应用

    Python零基础速成班-第10讲-Python面向对象编程(下),Property属性.特殊方法.设计模式.链表应用 学习目标 面向对象编程 接上一讲:Property属性.特殊方法.设计模式 面向 ...

  4. Python零基础速成班-第6讲-Python异常处理Exception,tryexcept,raise,assert,输入模块pyinputplus

    Python零基础速成班-第6讲-Python异常处理Exception,try&except,raise,assert,输入模块pyinputplus 学习目标 异常处理Exception: ...

  5. Python零基础速成班-第12讲-Python获取网络数据Socket,API接口,网络爬虫Crawler(制作弹幕词云)

    Python零基础速成班-第12讲-Python获取网络数据Socket,API接口,网络爬虫Crawler(制作弹幕词云) 学习目标 获取网络数据Socket API接口 网络爬虫Crawler(制 ...

  6. Python零基础速成班-第11讲-Python日志Logging,小游戏设计game of life

    Python零基础速成班-第11讲-Python日志Logging,小游戏设计game of life 学习目标 Python日志Logging 小游戏设计game of life 课后作业(2必做) ...

  7. Python零基础速成班-第8讲-Python文件操作File IO、高级文件处理模块shutil、CSV、JSON、多线程基础

    Python零基础速成班-第8讲-Python文件操作File I&O.高级文件处理模块shutil.CSV.JSON.多线程基础 学习目标 文件操作File I/O 高级文件处理模块shut ...

  8. Python零基础速成班-第14讲-Python处理Excel和Word,使用openpyxl和docx包详解,图表入门

    Python零基础速成班-第14讲-Python处理Excel和Word,使用openpyxl和docx包详解,图表入门 学习目标 Python处理Excel(使用openpyxl包).图表入门\ P ...

  9. Python零基础速成班-第2讲-Python基础(上),运算、变量、数据类型、输入输出

    Python零基础速成班-第2讲-Python基础(上),运算.变量.数据类型.输入输出 学习目标 使用print输出结果 运算及运算符 变量 数据类型(4种最常用的) 输入输出 课后作业(4必做+1 ...

最新文章

  1. 使用Ceph集群作为Kubernetes的动态分配持久化存储
  2. 图论 ---- C. Graph Transpositions(数据分阶段分层图最短路(二维) + 贪心)
  3. SSM项目使用GoEasy 实现web消息推送服务
  4. java 什么时候依赖注入_玩框架java依赖注入 – 何时使用单例
  5. mynt product model: D1000-IR-120标定相机和IMU外参
  6. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1
  7. 012 基于以太访的本地文件hash存储查找Dapp实例(合约安装部署)
  8. C#多线程学习(三) 生产者和消费者 1——解决线程间冲突的关键
  9. RouterOS利用(L2TP)实现异地组网
  10. zte d90 java_zte d90 驱动程序(最新更新)尼康d90驱动
  11. NOIP2002 产生数
  12. SpringCloud 微服务网关Gateway常用限流算法以及简单实现
  13. C语言学习周报(第四周)
  14. 工业虚拟现实3D可视化工厂车间三维展示
  15. 解决window聚焦图片不自动更新,没有“喜欢么”信息提示框问题
  16. linux使用df命令
  17. oracle分区注意点,ORACLE分区表梳理系列(二)- 分区表日常维护及注意事项
  18. 利用python requests库模拟登陆知乎
  19. JAVA代码审计之WebGoat靶场SQL注入
  20. win7下常用截图工具snipaste,常用gif制作工具ScreenToGif使用方法

热门文章

  1. 关于OpenCV打开摄像头默认分辨率是640*480的问题
  2. html2Canvas+JsPDF生成pdf文件并下载
  3. 学生成绩预测模型_每日排行榜|四川省大学生金融科技建模大赛 10.9
  4. Passbook学习笔记
  5. AMD和NVIDIA之间的显卡战争
  6. mybatis-plus max函数,sum函数的使用
  7. 摩托罗拉v3android,一问易答:MOTO推出Android版V3靠谱吗!
  8. MOOC数据结构与算法全套
  9. mysql 查看 dml_MySQL 命令查询过程及DML常用命令
  10. Spring注解大全,最后一个经常容易记不住