函数

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 函数、全局变量与局部变量、函数递归的更多相关文章

  1. Python3基础(3)集合、文件操作、字符转编码、函数、全局/局部变量、递归、函数式编程、高阶函数

    ---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...

  2. Python新手学习基础之函数-全局变量和局部变量

    全局变量和局部变量 我们通常把定义在函数外的变量成为全局变量,定义在函数内的变量称为局部变量,顾名思义,全局变量的作用域是整个代码段,局部变量的作用域就只是在它所属的代码段,变量只在它的作用域里有效. ...

  3. Day 10:函数全局变量和局部变量及函数嵌套

    全局变量:在所有函数之外赋值的变量,是全局变量. 局部变量:在函数内的变量是,局部变量 一个函数被调用时,就创建了一个局部作用域.在这个函数内赋值的所有变量,存在于该局部作用域内.该函数返回时,这个局 ...

  4. python函数 全局变量和局部变量

    li1=[1,2,3,4,5] str1='abc' def func1(): li1=[7,8,9] str1='efg' print(str1) func1() print(li1)#输出的结果为 ...

  5. python函数的 全局变量与局部变量

    一.函数的全局变量 1.什么是全局变量 顶着头开始写,没有任何缩进,在py文件的任何位置都能调用 #!/usr/bin/env python # _*_ coding:utf8 _*_ name=&q ...

  6. python学习-day15:局部变量与全局变量、嵌套函数、递归

    一.全局变量与局部变量 在子程序中定义的变量称为局部变量, 在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序.当全局变量与局部变量同名时:在定义局部 ...

  7. Python之路(第六篇)Python全局变量与局部变量、函数多层嵌套、函数递归

    一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序. 全局变量没有任何缩进,在任何位置都可 ...

  8. Python之路Python全局变量与局部变量、函数多层嵌套、函数递归

    Python之路Python全局变量与局部变量.函数多层嵌套.函数递归 一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局 ...

  9. python基础:函数传参、全局变量、局部变量、内置函数、匿名函数、递归、os模块、time模块

    ---恢复内容开始--- 一.函数相关: 1.1位置参数: ef hello(name,sex,county='china'): pass #hello('hh','nv') #位置参数.默认参数 1 ...

随机推荐

  1. python自学第12天 模块定义,导入,内置模块

    1.定义模块:用来从逻辑上组织python代码(实现一个功能),本质是.py结尾的python 包:本质就是一个目录(必须带有一个_init_.py文件)2.导入方法import module_nam ...

  2. xpath提取到的中文乱码时的解决办法

    βҳ转换为正常的中文:

  3. IntelliJ IDEA 如何生成时序图?

    进入扩展程序安装 File > Settings > Plugins > Browse Repositories 搜索 SequenceDiagram,点击右边 Install 安装 ...

  4. 忘记Linux用户密码怎么办?

           忘记密码解决办法(centos6.5版本) 1.开机时,在此页面一直按ESC 2.然后进入以下界面时,按一下字母  “E”    键 (3)再按字母   “E”   键 (4)之后 输入 ...

  5. 算法复杂度中的O(logN)底数是多少

    前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多少.算法中log级别的时间复杂度都是由于使用了分治思想,这 ...

  6. cocos2dx开发之util类&方法——取范围随机数

    #include <random> int random(int start, int end) { //return start+rand()%(end-start+1); static ...

  7. Python全栈之路----函数----作用域

    Python中,一个函数就是一个作用域. 局部变量放置在其作用域中,根据作用域来区分,函数属于你,函数属于我. 定义完成后,作用域已经生成,使用时顺着作用域链向上查找. 函数定义完成后,不管被在哪儿被 ...

  8. excle中如何将一串数字前后加上单引号

    1.新建excle表 2.构造如下一串字母加数字的字符串: 3.在B1栏中输入="“"&A1&"”",展示效果如下:

  9. 转载:python list和set的性能比较+两者转换

    两者性能比较(转自http://www.linuxidc.com/Linux/2012-07/66404.htm) 本来是知道在Python中使用Set是比较高效,但是没想到竟然有这么大的差距: ~$ ...

  10. Docker之 默认桥接网络与自定义桥接网卡

    docker引擎会默认创建一个docker0网桥,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和宿主机都放到同一个二层网络. 1. docker如何使用网桥 1.1 Linux虚拟网桥的特点 ...