函数

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. getfacl语法2

    一.setfacl——设定文件访问控制列表语法: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...  -m, --modify=acl 更改文件的访问控制 ...

  2. day 07 元组,字典和集合等数据类型介绍

    元组:就是一个不可变的列表 1.用途,当我们需要记录多个值,并且没有更改的需求的时候,应该使用元组 2定义方式:使用,在 ( ) 中分隔开多个任意类型的值 注:t=("egg",) ...

  3. Java EE 课程目标

    对于自己在本门课程的目标,首先是跟进老师的课程进度,努力完成老师下达的个人任务,以及需要与同伴一起合力完成的团队任务:其次是在课上课下的学习过程中,希望自己各方面的能力能有所提升:最后却也是最重要的一 ...

  4. 有人WIFI ble101配置

    新买来的模块,默认为slave模式,波特率57600,8位数据位,无检验位,1位停止位. 发送+++a,进入命令模式. 需要加回车符 1.设置模块名称 AT+NAME=BT_Shining 2.设置发 ...

  5. spring boot 项目无法访问静态页面

  6. 百度前端代码规范:HTML

    HTML 1.代码风格 1.1缩进与换行 [强制] 使用 4 个空格做为一个缩进层级,不允许使用 2 个空格 或 tab 字符. <style> ul { padding:; } < ...

  7. Angular4.0引入第三方框架,eg: bootstrap、jquery

    最近学习angular4.0,在练习是需要使用jquery和bootstrap.但是查阅了,大多数都是angular2的方法,或者是angular4.0的方法但是不准确.花了一些时间终于捣腾出来了,把 ...

  8. 学习笔记TF040:多GPU并行

    TensorFlow并行,模型并行,数据并行.模型并行根据不同模型设计不同并行方式,模型不同计算节点放在不同硬伯上资源运算.数据并行,比较通用简便实现大规模并行方式,同时使用多个硬件资源计算不同bat ...

  9. CodeForce 517 Div 2. B Curiosity Has No Limits

    http://codeforces.com/contest/1072/problem/B B. Curiosity Has No Limits time limit per test 1 second ...

  10. js中常用的内置对象

    Arguments 函数参数集合 arguments[ ] 函数参数的数组 Arguments 一个函数的参数和其他属性 Arguments.callee 当前正在运行的函数     Argument ...