python_06 函数、全局变量与局部变量、函数递归
函数
1.函数的定义:
def 函数名(参数):
#解释函数的功能
代码块
返回值
函数的定义主要有如下要点:
- def:表示函数的关键字
- 函数名:函数的名称,日后根据函数名调用函数
- 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
- 参数:为函数体提供数据,可不传参数,若不传参数则调用函数时不能传参数
- 返回值:当函数执行完毕后,可以给调用者返回数据。若没有返回值,则返回None
- 遇到第一个return则函数结束
返回值=0:返回None
返回值=1:返回对象object
返回值>1:返回元组tuple
def test(x):
'''
这个函数是用来计算y=2x+4的值
:param:整形的数字
返回值:y
'''
y=2*x+4
print(y)
return y print(test)
test(3)
2.函数的参数
1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
2.实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传给形参。因此应预先用赋值,输入等办法使参数获得确定值。
def calc(x,y):
res=x**y
return res
a=10
b=2
print(calc(a,b))
3.位置参数和关键字(标准调用:实参与形参位置一一对应;关键字调用:位置无需固定)
def test(x,y,z):
print(x)
print(y)
print(z) test(1,2,3)
test(y=4,x=3,z=2)#关键字参数
#若混合使用,位置参数必须在关键字参数的左边
4.默认参数
def handle(x,type='rers'):
print(x)
print(type) handle('hello')
handle('hello','world') >>>hello
rers
>>>hello
world
5.参数组
#参数组:**字典 *列表:接收参数时以列表形式接收,处理时以元组方式处理
def test(x,*args):
print(x)
print(args)
test(1,2,3,[6],{123:'er'})
test(1,['x','y','z'])#以整体形式传给*args元组的第一个元素
test(1,*['x','y','z'])#以列表形式传给*args,相当于遍历列表中元素赋值给args
test(1,*{'name':'zlex'})#相当于遍历字典的key传给元组 >>>1
(2, 3, [6], {123: 'er'})
>>>1
(['x', 'y', 'z'],)
>>>1
('x', 'y', 'z')
>>>1
('name',)
def test(x,**kwargs):
print(x)
print(kwargs)
test(1,y=3,z=4,k=5)#后面的值以字典的形式传给**kwargs >>>1
{'y': 3, 'z': 4, 'k': 5}
def test(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
test(1,3,4,5,6,z=4,k=5) >>>1
(3, 4, 5, 6)
{'z': 4, 'k': 5} ##########################
test(1,[3,4,5,6],{'z':4,'k':5},z=4,k=5) >>>1
([3, 4, 5, 6], {'z': 4, 'k': 5})
{'z': 4, 'k': 5} ##################
test(1,*[3,4,5,6],**{'z':4,'k':5}) >>>1
(3, 4, 5, 6)
{'z': 4, 'k': 5}
默认多余的位置参数传给*args,多余的关键字参数传给**kwargs
局部变量与全局变量
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
name='alex' def change(): print(name) change()
print(name)
global关键字:
#如果函数无global关键字: #——有声明局部变量
name=['aaa','bbb']
def change1():
name='ccc'
print(name)
change1() >>>ccc #——无声明局部变量
name=['aaa','bbb']
def change2():
print(name)
change2() >>>[aaa,bbb] #######################
#如果函数中有global关键字: #——有声明局部变量
name=['aaa','bbb']
def change3():
global name
name='ddd'
print(name)
change3() >>>ddd #——无声明局部变量
name=['aaa','bbb']
def change4():
global name
name.append('eee')
print(name) >>>[aaa,bbb,eee]
书写规范:全局变量一般都大写,局部变量一般都小写
练习:
NAME='海风' def huangwei():
name='黄伟'
print(name)
def liuyang():
name='刘洋'
print(name)
def huzhihua():
name='沪指花'
print(name)
print(name)
huzhihua()
liuyang()
print(name) huangwei() >>>黄伟
刘洋
刘洋
沪指花
黄伟
name="刚亮" def weihou():
name="陈卓"
def weiweihou():
global name
name="冷静"
weiweihou()
print(name) print(name)
weihou()
print(name) >>>刚亮
陈卓
冷静
nonlocal关键字:指定上一级变量
name="刚亮" def weihou():
name="陈卓"
def weiweihou():
nonlocal name
name="冷静"
weiweihou()
print(name) print(name)
weihou()
print(name) >>>刚亮
冷静
刚亮
风湿理论:函数即变量,函数在定义时相当于开辟一部分内存将函数内容存入,但不执行,调用函数名时再执行函数中内容。
递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
def cal(n):
print(n)
if int(n/2)==0:
return n
return cal(int(n/2)) cal(10) >>>10
5
2
1
递归特性:
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会多加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,就会导致栈的溢出)
#0,1,1,2,3,5,8,13 # #斐波那契数列
a=0
b=1
def phil():
global b
global a
print(a)
c=a+b
a=b
b=c
if c>100000:
return c
return phil()
phil() >>>0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
问路函数
#问路函数,问第一个人不知道,第一个人就问第二个人,依次类推
#问到答案时依次返回答案
person_list=['luren1','luren2','luren3','luren4'] def ask_way(p_l):
print('#'*60)
if len(p_l)==0:
return '我们都不知道'
p=p_l.pop(0)
if p=='luren4':
return '%s说:我知道,在五环大道'%p
# time.sleep(1)
print('hi%s,请问家乐福怎么走'%p)
print('%s说:我不知道,我帮你问问%s'%(p,",".join(p_l)))
res=ask_way(p_l)
print('%s问的结果是:%s'%(p,res))
return res result=ask_way(person_list)
print(result) >>>############################################################
hiluren1,请问家乐福怎么走
luren1说:我不知道,我帮你问问luren2,luren3,luren4
############################################################
hiluren2,请问家乐福怎么走
luren2说:我不知道,我帮你问问luren3,luren4
############################################################
hiluren3,请问家乐福怎么走
luren3说:我不知道,我帮你问问luren4
############################################################
luren3问的结果是:luren4说:我知道,在五环大道
luren2问的结果是:luren4说:我知道,在五环大道
luren1问的结果是:luren4说:我知道,在五环大道
luren4说:我知道,在五环大道
python_06 函数、全局变量与局部变量、函数递归的更多相关文章
- Python3基础(3)集合、文件操作、字符转编码、函数、全局/局部变量、递归、函数式编程、高阶函数
---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...
- Python新手学习基础之函数-全局变量和局部变量
全局变量和局部变量 我们通常把定义在函数外的变量成为全局变量,定义在函数内的变量称为局部变量,顾名思义,全局变量的作用域是整个代码段,局部变量的作用域就只是在它所属的代码段,变量只在它的作用域里有效. ...
- Day 10:函数全局变量和局部变量及函数嵌套
全局变量:在所有函数之外赋值的变量,是全局变量. 局部变量:在函数内的变量是,局部变量 一个函数被调用时,就创建了一个局部作用域.在这个函数内赋值的所有变量,存在于该局部作用域内.该函数返回时,这个局 ...
- python函数 全局变量和局部变量
li1=[1,2,3,4,5] str1='abc' def func1(): li1=[7,8,9] str1='efg' print(str1) func1() print(li1)#输出的结果为 ...
- python函数的 全局变量与局部变量
一.函数的全局变量 1.什么是全局变量 顶着头开始写,没有任何缩进,在py文件的任何位置都能调用 #!/usr/bin/env python # _*_ coding:utf8 _*_ name=&q ...
- python学习-day15:局部变量与全局变量、嵌套函数、递归
一.全局变量与局部变量 在子程序中定义的变量称为局部变量, 在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序.当全局变量与局部变量同名时:在定义局部 ...
- Python之路(第六篇)Python全局变量与局部变量、函数多层嵌套、函数递归
一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序. 全局变量没有任何缩进,在任何位置都可 ...
- Python之路Python全局变量与局部变量、函数多层嵌套、函数递归
Python之路Python全局变量与局部变量.函数多层嵌套.函数递归 一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局 ...
- python基础:函数传参、全局变量、局部变量、内置函数、匿名函数、递归、os模块、time模块
---恢复内容开始--- 一.函数相关: 1.1位置参数: ef hello(name,sex,county='china'): pass #hello('hh','nv') #位置参数.默认参数 1 ...
随机推荐
- [Go back to REDIS]
Overview 内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件. redis底层数据结构:跳跃表 [为什么选skiplist而不是red-black tree] 支持多种数据结构:Str ...
- 获取当前时间并格式化,CTime类
CTime类,此类应该不是C++标准类库,属于windows封装的关于时间的类库,使用环境应该为 Win32程序,MFC程序,VC++程序 CTime tm = CTime::GetCurrentTi ...
- Spring Boot 常见标签
@Controller(value=“名字”,descripation="描述",tags="具体" ) @RestController控制器(path=&qu ...
- rootfs 制作
最小 根文件系统 (1)/dev/console(终端控制台, 提供标准输入.标准输出以及标准错误) /dev/null (表示空设备终端, 所有写到这个文件中的数据都会被丢弃掉.) (2)init进 ...
- Flask+uwsgi+virtualenv环境配置
Linux系统版本: SLES12sp3 (阿里云) 1. 首先需要安装python-devel,否则后续安装会报错! rpm -qa|grep python-base 结果: python-base ...
- C++常见的概念
1)多态:允许将子类类型的指针赋值给父类类型的指针.赋值以后,父类对象可以根据当前赋值给它的子类对象的特性以不同的方式运作. 2)深拷贝:重新分配内存:浅拷贝:共用同一内存. 3)友元:非成员函数不能 ...
- ViewpagerHandler
import android.os.AsyncTask; import android.os.Handler; import android.os.Message; import android.su ...
- 使用fpm 方便快速生成postgresql extension分发包
fpm 是一个不错,而且强大的rpm.deb,系统启动服务工具包,我们可以用来快速的生成专业的软件分发包 演示一个pg 扩展包分发包的生成(rpm 以及deb) 安装fpm sudo gem inst ...
- iOS兼容性(不断完善)
1.iOs不支持iframe,不支持flash,如果移动端要嵌入视频,请用html5 的video标签.
- confluence6.3.1部署+数据迁移
目录: 环境准备 搭建方法 数据迁移 搭建过程中的bug 1,confluence部署 1.1,环境准备 Java:jdk1.8 mysql: 数据库编码规则选择utf8 -- UTF-8 Unico ...