11、函数(def)
11.1、函数:
函数即变量
函数的作用域只跟函数声明时定义的作用域有关,跟函数的调用位置无任何关系
1、函数格式:
def test(x):
'''
2*x+1
:param x:整形数字
:return: 返回计算结果
'''
y = 2 * x + 1
return y
a = test()
#调用函数
print(a)
11.2、函数返回:
1、规则:
(1)函数的返回值可以是任何数据类型
(2)函数如果有多个返回值用逗号隔开
(3)函数只用一个返回值时,返回值的数据类型不发生改变
(4)函数有多个返回值时,返回值以元组的形式返回
(5)函数遇到return时函数结束
2、用法:
def test01():
msg = 'test01'
return msg
#函数返回一个值
def test02():
msg = 'test02'
return 1, 2, 3, 4, 'a', ['alex'], {'name': 'alex'}, None
#函数返回多个值
t1 = test01()
t2 = test02()
print(t1)
print(t2)
11.3、函数普通传参:
1、规则:
(1)函数分为形参和实参,形参在函数被调用后释放
(2)位置参数,必须一一对应,缺一不行多一也不行
(3)关键字参数,无须一一对应,缺一不行多一也不行
(4)两者混用时,位置参数必须在关键字参数左边
(5)默认参数在不传入实参时使用默认值,在传入实参时默认参数值被覆盖
(6)一个参数不能传多个值
2、用法:
(1)位置参数:
def test(x, y, z):
print(x)
print(y)
print(z)
test(1, 2, 3)
(2)关键字参数:
def test(x, y, z):
print(x)
print(y)
print(z)
test(y=1, x=3, z=4)
(3)位置参数和关键字参数混用:
def test(x, y, z):
print(x)
print(y)
print(z)
test(1, y=2, 3)
#报错
test(1, 3, y=2)
#报错
test(1, 3, z=2, y=4)
#报错
test(z=2, 1, 3)
#报错
test(1, 3, z=2)
(4)默认参数:
def handle(x, type='mysql'):
print(x)
print(type)
handle('hello')
handle('hello', type='sqlite')
11.4、参数组:
1、规则:
(1)列表参数:
实参的数据类型除字典外都可以
可以传入多个实参
实参可以重复
传入的实参以元组的形式存储,不传入实参是空元组
传入的列表格式为*[1,2,3,4],传入元组的格式为*(5,6,7,8)
(2)字典参数:
实参的数据类型只能是字典
可以传入多个实参
实参的key值不可以重复
传入的实参以字典的形式存储,不传入实参是空字典
传入字典的格式为**{1:2,3:4}(key必须是字符串型)或 y=2, z=3;
(3)列表参数和字典参数在一起使用:
可以传递任何的参数
2、用法:
(1)参数组之列表参数(*args):
def test(x, *args):
print(x)
print(args)
test(1)
test(1, *['x', 'y', 'z'],*('x', 'y', 'z'),1,2,3,3,4,5)
(2)参数组之字典参数(**kwargs):
def test(x, **kwargs):
print(x)
print(kwargs)
test(1)
test(1,**{"a":5,"b":6},y=2, z=3)
(3)列表参数和字典参数混用:
def test(x, *args, **kwargs):
print(x)
print(args, args[-1])
print(kwargs, kwargs.get('y'))
test(1, *['x', 'y', 'z'],*('x', 'y', 'z'),1,2,3,3,4,5,**{"a":5,"b":6},y=2, z=3)
#输出结果:
#1
#('x', 'y', 'z', 'x', 'y', 'z', 1, 2, 3, 3, 4, 5) 5
#{'a': 5, 'b': 6, 'y': 2, 'z': 3} 2
11.5、函数局部变量和全局变量:
1、规则:
(1)函数的内容无global关键字:
1)有声明局部变量:
优先读取局部变量,能读取全局变量,无法对全局变量重新赋值
2)无声明局部变量:
能读取全局变量,无法对全局变量重新赋值
(2)函数的内容有global关键字:
1)有声明局部变量:
局部变量本质上就是全局的那个变量,全局变量可读取可赋值
2)无声明局部变量:
全局变量可读取可赋值
(3)nonlocal:
nonlocal代表指定上一级变量,如果没有就继续往上直到找到为止,上一级只能是局部变量,
如果是全局变量会报错;
(4)变量书写规范:
全局变量的变量名大写,局部变量的变量名小写
global和nonlocal声明必须写在函数的最上面
2、用法:
name = "test01"
def lc():
global name
name = "test02"
name1 = "test04"
def lc1():
nonlocal name1
name1 = "test03"
lc1()
print(name1)
print(name)
lc()
print(name)
# 输出值为:test01、test03、test02
11.6、函数的向前引进:
1、规则:
(1)函数即变量,调用时生效,不调用不生效
(2)python是按照顺序依次从上往下执行的,函数都是加载到内存当中的,
只要在所有的函数之后调用函数都能够调用到;
2、用法:
(1)
def bar():
print('from bar')
def foo():
print('from foo')
bar()
foo()
(2)
def foo():
print('from foo')
bar()
def bar():
print('from bar')
foo()
11.7、函数的递归:
1、规则:
(1)递归函数意在减小问题的规模
(2)递归函数是一层一层的调用自己,在得到结果后再一层层的将结果进行返回
(3)递归函数效率不高
2、用法:
def calc(n):
if int(n / 2) == 0:
return n
res = calc(int(n / 2))
return res
print(calc(5))
#示意图:
11.8、匿名函数:
1、匿名函数的格式:
func=lambda x:x+1
# x表示输入的变量,x+1表示return x+1
print(func(10))
上面的匿名函数等价于如下函数:
def func(x):
return x+1
print(func(10))
2、说明:
(1)匿名函数只能用于简单的逻辑计算;
(2)匿名函数常与其他函数一同使用;
11.9、高阶函数:
1、高阶函数定义:
(1)函数接收的参数是一个函数名
(2)函数的返回值是一个函数名
(3)满足上述条件任意一个,都可称之为高阶函数
2、示例:
(1)把函数当作参数传给另外一个函数:
def foo(n):
print(n)
def bar(name):
print('my name is %s' %name)
foo(bar('lc'))
"""
输出结果:
my name is lc
None #因为函数没有返回值,所以print(n)时打印出了None
"""
(2)返回值中包含函数:
def bar():
print('from bar')
def foo():
print('from foo')
return bar
foo()()
"""
输出结果:
from foo
from bar
"""
11、函数(def)的更多相关文章
- 函数def
函数:把执行一定功能的动作封装到一起>>> def 函数名(形参) 通过一个 函数名(实参) 去调用它,传参来执行功能.动作,输出结果 .定义:def ...
- day 9~11 函数
今日内容 '''函数四个组成部分函数名:保存的是函数的地址,是调用函数的依据函数体:就是执行特定功能的代码块函数返回值:代码块执行的结果反馈函数参数:完成功能需要的条件信息1.函数的概念2.函数的定 ...
- python note 11 函数名的使用、闭包、迭代器
1.函数名就是一个变量 def func(): print("我是一个小小的函数") a = func print(a) #输出变量存放地址 <function func a ...
- python函数def
#函数就是实现一个特定功能的程序块 #下面这个函数实现了打印helloworld的功能 def print_hello(): print('hello world!') #这是调用方法 print_h ...
- c++11 函数模板的默认模板参数
c++11 函数模板的默认模板参数 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> ...
- Day 11 函数之对象和名称空间与作用域
函数对象 函数是第一类对象,即函数可以被当做数据处理 函数对象的四大功能 1.引用 x=100 y=x def func() pass f=func print(f) #打印结果 #<funct ...
- python中的函数def和函数的参数
'''函数: 1.减少代码重用性 2.易维护 3.可扩展性强 4.类型function 定义函数: def 函数变量名(): 函数的调用: 1.函数名加括号 2.函数如果没被调用,不会去执行函数内部的 ...
- Day 11:函数装饰器
在说装饰器前,先说一个东西,再Python里,有一个 一切皆对象,一切皆变量. 例: def hello(name="sunjinyao"): return "hi &q ...
- D14 集合set 函数def
把 字符串 元祖 变成集合的方法 因为列表是可变的所以不能变为集合 # s=set('hello')# print(s)## s=set(['alex','alex','sb'])# print ...
随机推荐
- Could not open device at /dev/ipmi0
Could not open device at /dev/ipmi0 分类: LINUX 2013-09-02 17:01:37 Could not open device at /dev/ip ...
- 05丨实验:安装MongoDB
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ 源码安装 export PATH=$PATH:/data/mo ...
- MYSQL数据库快速添加测试数据方法
先添加两条数据,这里最好添加两条不一样的数据 INSERT INTO "表名"(**, **) VALUES (**,**),(**,**) 然后再次添加数据,这次把查询到的数据添 ...
- 使用 .NET 升级助手将.NET Framework应用迁移到.NET 5
从.NET Framework 迁移到.NET 5 犹如搬家,我们都知道搬家是很痛苦的,我们请求搬家公司来减轻我们的压力,.NET 升级助手 的作用就类似我们聘请的搬家公司,帮助我们处理繁重乏味的迁移 ...
- jackson学习+CVE-2019-12086漏洞分析
jackson和fastjson差不多,都是用来更方便的处理json 国人用fastjson,老外用jackson/gson比较多 环境搭建: pom.xml: <dependency> ...
- Go语言练习---判断闰年以及根据现在的秒数求现在的年月日
package main import ( "fmt" "math" "time" ) /* @闰年判断 ·封装一个函数判断某一个年份是不是 ...
- GO语言面向对象01---封装属性与创建对象的方法与工厂模式
package main import "fmt" /* 面向过程编程:调度大量的变量.函数 ---------- 面向对象编程(OOP=Object Oriented Progr ...
- Pytorch和CNN图像分类
Pytorch和CNN图像分类 PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序.它主要由Facebookd的人工智能小组开发,不仅能够 实现强大的GPU加速 ...
- .NET平台系列14 .NET5中的新增功能
系列目录 [已更新最新开发文章,点击查看详细] .NET5中不包含的内容 尽管 .NET5 框架中提供了一组重要 API,但它并不包括过去20年左右开发的所有 API,但是.NET Stand ...
- 解决redis集群版本不一致导致RDB同步失败的问题
某天,运维反馈某两个机房的出口流量和入口流量过大,并且持续了好一段时间. 再仔细排查后发现是 redis 集群的几台服流量问题,于是开始查日志. 在日志中发现出现大量的 Can't handle RD ...