函数

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. 1) 嵌套的 div ,或者 ul ol .li 阻止冒泡 ,特别是 对应onclick="test(event)" 通过传递event 阻止 冒泡. cancelBubble , stopPropagation

    1 .html 结构: <ul class="ul_2 hide" data-first="5"> <li class="li_2& ...

  2. lvm创建和在线扩容

    添加磁盘后创建lvm lsblk 或是fdisk  -l  查看添加的磁盘 fdisk  -l lsblk 进入到sdb创建分区 n新建p标准分区e扩展分区1序列号 加10G或全给 p查看 要创建lv ...

  3. net start/stop mysql access denied.拒绝访问

    转载:Mysql net start mysql启动,提示发生系统错误 5 拒绝访问 解决之道 为什么会出现这个问题呢?经过一番思考找到原因了,是因为当前用户的操作权限太低了,出了问题 出错问题截屏如 ...

  4. Redis配置文件 redis.conf 解读(一)

    # Redis configuration file example# redis配置文件模板# Note on units: when memory size is needed, it is po ...

  5. 基于SPA的网页授权流程(微信OAuth2)

    先说传统MVC网站的网页授权流程. 1.用户发起了某个需要登录执行的操作 2.收集AppId等信息重定向到微信服务器 3.微信服务器回调到网站某个Controller的Action 4.在此Actio ...

  6. 整理面试问题iOS

    1.如何添加手势操作. 我们以在view上来举例 //创建一个view UIView *tapView=[UIView new]; tapView.frame=CGRectMake(, , kWidt ...

  7. Codeforces1062B. Math(合数分解)

    题目链接:传送门 题目: B. Math time limit per test second memory limit per test megabytes input standard input ...

  8. Devexpress Winform MVVM

    归纳总结备忘 Devexpress Winform MVVM Practice 前言 MVVM Devexpress 正文 databindings及 UI Triggers Command 委托Co ...

  9. vue watch 可以监听子组件props里面属性的改变

    子组件watch 可以监听其props里面属性的改变 当changeFather导致calm改变时,会执行console.log('props change');

  10. 20165308 2017-2018-2 《Java程序设计》课程总结

    20165308 2017-2018-2 <Java程序设计>课程总结 一.每周作业及实验报告链接汇总 我期待的师生关系 学习基础和c语言调查 Linux 安装及学习 第一周学习总结 第二 ...