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 ...
随机推荐
- poi读取word的内容
pache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 1.读取word 2003及word 2007需要的 ...
- Socket网络编程入门
Socket:专业术语:套接字;通俗的解释:两孔插座(一个孔:IP地址,一个孔:端口号).使用场景:通信,如QQ好友交谈,如浏览器的进程怎么与web服务器通信等. Socket来历: socket起源 ...
- Xcodebuild ipa shell
命令行下打包iOS App工程: #!/bin/sh # # How To Build ? #http://www.jianshu.com/p/3f43370437d2 #http://www.jia ...
- 如何在 Windows 中设置 /3GB 启动开关
备注: 只有在下列操作系统中才支持 /3GB 开关: Windows 2000 Advanced Server Windows 2000 Datacenter Server Windows Serve ...
- 未能加载或程序集“XXXX,Version=0.0.0.0,Culter=neutral,PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。
问题描述:在VS中运行一个C#程序,出现错误: 未能加载或程序集“XXXX,Version=0.0.0.0,Culter=neutral,PublicKeyToken=null”或它的某一个依赖项.试 ...
- C#语言与变量、数据类型
一.计算机语言 1.计算机语言包括:C\PHP\Ruby\JAVA\C#\Basi\JS\C++ 2.计算机语言发展史:机器语言——汇编语言——高级语言 二.代码 1.程序始终:Code(编码).Co ...
- 19/03/15Pyhon笔记
1.快速在python中显示目标的2进制写法 bin(342) "0b101010110" 2.一个二进制位就是一比特(bit) 3.Python2默认无法识别中文,需要加文件头 ...
- 洋葱第4场C和D题解……
只是记录一下: 我们机房讨论的结果……(当然有一个au爷一开始就秒掉了……首先先n^2或随机枚举出一对点根据抽屉原理可得枚举(n/2)^2+1次后至少有一对点全是对的然后对于两个对的点,首先考虑缩放比 ...
- selenium基础用法(爬虫)
初识selenium selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏 ...
- 黄聪:JS数学计算精度修正
问题描述 如果我问你,4330.61乘以100等于多少,我猜你肯定跟我说:“肯定是 433061”啊! 是啊,要我我也是这么回答,来来来我们来看看浏览器怎么说吧,如下图 浏览器告诉我,他就是算不对 ...