Python-06-函数
一、函数的定义
函数是第一类对象,即函数可以当作数据传递
#1 可以被引用
#2 可以当作参数传递
#3 返回值可以是函数
#3 可以当作容器类型的元素
1. 定义方式
def 函数名(参数1,参数2,参数3,...):
'''注释'''
函数体
return 返回的值
2. 函数的返回值
无return->None
return1个值->返回1个值
return 逗号分隔多个值->元组
二、函数的调用
1. 调用的方法
函数的调用:函数名加括号
- 先找到名字
- 根据名字调用代码
2. 先定义,再调用
函数即“变量”,“变量”必须先定义后引用。未定义而直接引用函数,就相当于在引用一个不存在的变量名
#测试一
def foo():
print('from foo')
bar()
foo() #报错 #测试二
def bar():
print('from bar')
def foo():
print('from foo')
bar()
foo() #正常 #测试三
def foo():
print('from foo')
bar() def bar():
print('from bar')
foo() #会报错吗? #结论:函数的使用,必须遵循原则:先定义,后调用
#我们在使用函数时,一定要明确地区分定义阶段和调用阶段 #定义阶段
def foo():
print('from foo')
bar()
def bar():
print('from bar')
#调用阶段
foo()
三、函数的参数
1. 位置参数
按照从左到右的顺序定义的参数
位置形参:必选参数
位置实参:按照位置给形参传值
2、关键字参数
按照key=value的形式定义的实参无需按照位置为形参传值 ,
注意的问题:
1. 关键字实参必须在位置实参右面
2. 对同一个形参不能重复传值
3、默认参数
形参在定义时就已经为其赋值可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
注意的问题:
1. 只在定义时赋值一次
2. 默认参数的定义应该在位置形参右面
3. 默认参数通常应该定义成不可变类型
4. 可变长参数
可变长指的是实参值的个数不固定, 而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs
def test(x, *args, **kwargs):
print(x)
print(args)
print(kwargs)
test(1, *[2, 3, 4, 5], **{'y': 2, 'z': 3}) 运行结果:
1
(2, 3, 4, 5)
{'y': 2, 'z': 3}
def test(x, *args, **kwargs):
print(x)
print(args)
print(kwargs)
test(1, 2, 3, 4, 5, y=2, z=3) 运行结果:
1
(2, 3, 4, 5)
{'y': 2, 'z': 3}
四、全局变量和局部变量
顶头写的是全局变量
函数内部的是局部变量
global指定全局变量
nonlocal指定上一级的变量
name = "刚娘"
def weihou():
name = "陈卓"
def weiweihou():
global name # global,指定全局变量
name = "冷静" weiweihou()
print(name) print(name)
weihou()
print(name) # 刚娘
# 陈卓
# 冷静
name = "刚娘"
def weihou():
name = "陈卓"
def weiweihou():
nonlocal name # nonlocal,指定上一级变量,如果没有就继续往上直到找到为止
name = "冷静" weiweihou()
print(name) print(name)
weihou()
print(name) # 刚娘
# 冷静
# 刚娘
五、风湿理论(函数即变量)
# def foo():
# print('from foo')
# bar()
#
# foo()
# 报错 # def bar():
# print('from bar')
# def foo():
# print('from foo')
# bar()
#
# foo()
# 不报错 # def foo():
# print('from foo')
# bar()
#
# def bar():
# print('from bar')
# foo()
# 不报错 # def foo():
# print('from foo')
# bar()
#
# foo()
#
# def bar():
# print('from bar')
# 报错
六、递归
1. 定义
如果一个函数在内部调用自身本身,这个函数就是递归函数
def calc(n):
print(n)
if n // 2 == 0:
return
return calc(n / 2)
calc(10) 10
5.0
2.5
1.25
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
七、函数的作用域
1. 作用域即范围
- 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效
- 局部范围(局部名称空间属于该范围):临时存活,局部有效
2. 作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关
x=1
def f1():
def f2():
print(x)
return f2
x=100
def f3(func):
x=2
func()
x=10000
f3(f1())
3. 查看作用域:globals(),locals()
LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__
locals 是函数内的名字空间,包括局部变量和形参
enclosing 外部嵌套函数的名字空间(闭包中常见)
globals 全局变量,函数定义所在模块的名字空间
builtins 内置模块的名字空间
八、匿名函数
匿名函数lambda x: x * x实际上就是:
def f(x):
return x * x
关键字lambda表示匿名函数,冒号前面的x表示函数参数。
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25
同样,也可以把匿名函数作为返回值返回,比如:
def build(x, y):
return lambda: x * x + y * y
Python-06-函数的更多相关文章
- python 06函数
python中函数定义方法: def test(x): "The function definitions" x+=1 return x def:定义函数的关键字test:函数名( ...
- 【276】◀▶ Python 字符串函数说明
参考:Python 字符串函数 01 capitalize 把字符串的第一个字符大写,其他字母变小写. 02 center 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串. ...
- python的函数
函数一词起源于数学,但是在编程中的函数和数学中的有很大不同.编程中的函数式组织好的,可重复使用的,用于实现单一功能或相关联功能的代码块. 我们在学习过程中已经使用过一些python内建的函数,如pri ...
- python strip()函数 介绍
python strip()函数 介绍,需要的朋友可以参考一下 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除 ...
- python split()函数
Python split()函数 函数原型: split([char][, num])默认用空格分割,参数char为分割字符,num为分割次数,即分割成(num+1)个字符串 1.按某一个字符分割. ...
- Python数学函数
1.Python数学函数 1.abs(x):取绝对值,内建函数 2.math.ceil(x):向上取整,在math模块中 3.cmp(x,y):如果 x < y ,返回-1:如果 x == y ...
- Python回调函数用法实例详解
本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
- Python之函数与变量
本节内容 函数介绍及其作用 函数的定义与调用 函数的参数说明 全局变量与局部变量 值传递和引用传递 一.函数的介绍及其作用 编程语言中的函数与数学中的函数是有区别的:数学中的函数有参数(输入),就会有 ...
- Python基础-函数篇
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 函数与函数式编程 1.面向对象: 华山派-- ...
- 【C++实现python字符串函数库】strip、lstrip、rstrip方法
[C++实现python字符串函数库]strip.lstrip.rstrip方法 这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' '). s.st ...
随机推荐
- vue pc客户端项目总结
https://blog.csdn.net/oumaharuki/article/details/78861778
- EF自动创建数据库步骤之二(继承DbContext类)
创建好表实体类后,接着就是创建数据库上下文(继承DbContext)并将实体类添加进来. 代码示例如下: using DBClientEntity; using System; using Syste ...
- javascript DOM拓展
针对JS高级程序设计这本书,主要是理解概念,大部分要点源自书内.写这个主要是当个笔记加总结 存在的问题请大家多多指正! DOM拓展 1选择符 API 1.1 querySelector() 由docu ...
- sudo: /usr/lib/sudo/sudoers.so must be only be writable by owner
因为某种原因,手动给usr文件夹改了权限,之后我自己这个账户(非root)就不能运行sudo命令,提示"sudo: /usr/lib/sudo/sudoers.so must be only ...
- Linux文本编辑器Vim使用
1. 插入 o 在光标下插入新行 a 在光标后插入 i 在光标前插入 O 在光标上一行插入新行 A 在光标行尾插入 I 在光标行首插入 2.光标定位 gg 到第一行行首 G 到最后一行 ...
- 使用ARP获取局域网内设备IP和MAC地址
根据Arp列表数据,查询本地设备在线状态 使用 arp -a 获得所有内网地址,首先看Mod对象 public struct MacIpPair { public string HostName; p ...
- In Java, how can I test if an Array contains a certain value?
public static final String[] VALUES = newString[]{"AB","BC","CD"," ...
- linux防止恶意采集攻防战
这两天ytkah开发的一个中大型项目被人盯上了,网站打开非常慢,查看了一下cpu.内存使用情况,30%左右占用不高,网络上下行就比较大了,IO实时流量达到40MB,IO总流量更是7TB,非常大的数据量 ...
- jdbc笔记2
private static String driver; private static String url; private static String username; private sta ...
- 使用uwsgi+nginx部署项目
Uwsgi:部署web应用程序 Nginx:反向代理,静态服务器 1.修改uwsgi配置文件>nginx反向代理[nginx接收请求->传递->[uwsgi] http=.. --& ...