Python学习(六)—— 函数、全局变量与局部变量
函数
函数的定义
def test(x):
"The function definition"
x += 1
return x
def:定义函数的关键字
test:函数名
():内可定义形参
“”:文档描述,非必要,但添加后可使得函数更易理解
x += 1:泛指代码块或程序处理逻辑,最好不要过多,让函数的功能简洁明了
return :定义返回值
调用运行:可以带参数也可以不带
函数名()
def test(x):
"The function definition"
x += 1
return x
y = test(5)
print(y)
#
def test1():
"The function definition"
x = 5
y = x * 2 + 1
return y
y = test1()
print(y)
#
注意:函数名一旦重名,后写的函数会覆盖先写的函数,因为Python是从上到下读取的。
使用函数的意义
实现特定的功能,避免重复代码
1、代码重用
2、保持一致性,易于维护
3、可扩展性
函数与过程
过程本质是函数,但是没有设定返回值,而在Python中,会自动为过程返回None
def test01():
x = "I like Python"
print(x)
return x
t1 = test01()
print(t1)
"""
I like Python
I like Python
"""
def test02():
x = "I like Python"
print(x)
t2 = test02()
"""
I like Python
None
"""
返回值数:0 => None
返回值数:1 => 返回object
返回值数:>1 =>返回tuple
函数参数
形参:只有在被调用时才分配内存单元,在调用结束后,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
实参:可以是常量、变量、表达式、函数等,无论是何种类型,在进行函数调用时,它们都必须有明确的值,以便将这些值传给形参。因此,应预先用赋值、输入等方法使参数获得确定值。
位置参数和关键字:标准调用:实参和形参位置意义对应;关键字调用:位置无需固定
def test(x,y,z): #x,y,z是形参
h = x + y ** z
return h
t1 = test(1,2,3) #1,2,3是实参,属于位置参数
print(t1)
t2 = test(x = 2, y =2, z = 2) #属于关键字调用
print(t2)
"""
9
6
"""
注意:二者混用时,位置参数一定要在关键字参数的 左边
默认参数
def test(x,type="None"): #type是默认参数
print(x)
print(type) test(5)
test(5,type="Class")
"""
5
None
5
Class
"""
参数组
**字典 *列表
def test(x,*args):
print(x)
print(args)
print(args[0])
test(1,2,3,5)
"""
1
(2, 3, 5)
2
"""
def test(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
test(1,2,3,5,7,9,y=9)
"""
1
(2, 3, 5, 7, 9)
{'y': 9}
"""
全局变量与局部变量
定头写的是全局变量,在整个py文件中都可以调用
局部变量是子程序中定义的变量,只能在子程序中调用
name = "Sister" #全局变量
def test():
name = "Jenny" #局部变量
print("change_name:",name)
test()
#change_name: Jenny
强制修改成全部变量的方法: 用global
name = "Sister"
def test():
global name #将其定义为全局变量
name = "Jenny"
print("change_name:",name)
test()
print(name)
"""
change_name: Jenny
Jenny
"""
注意:
1、如果函数内无global关键字,优先读取局部变量,能读取全局变量,无法对全局变量重新赋值,但对于可变类型,可以对内部元素进行操作
name = "Sister"
def test():
name = "Jenny"
print("I love ", name)
test()
print(name)
"""
I love Jenny
Sister
"""
name1 = ["Allen", "Paul"]
def test1():
name1.append("Jenny")
print("I love ", name1)
test1()
print(name1)
"""
I love ['Allen', 'Paul', 'Jenny']
['Allen', 'Paul', 'Jenny']
"""
2、如果函数中有global关键字,变量本质上就是全局的特定变量,可读取可赋值
3、全局变量名全用大写,局部变量名全用小写
函数的嵌套
def huangwei(): #执行顺序: 1→14→2、3→4→12→5、6→7→10→11→8、9→13
name = "黄伟"
print(name)
def liuyang():
name = "刘洋"
print(name)
def nulige():
name = '沪指花'
print(name)
print(name)
nulige()
liuyang()
print(name) #只调用这个子函数内部的变量
huangwei()
"""
黄伟
刘洋
刘洋
沪指花
黄伟
"""
注意:可以用nonlocal直接指定上一级变量
前向引用 :函数即变量
def top():
print("from top to bottom")
def bottom():
print("from bottom to top")
top()
bottom()
"""
from bottom to top
from top to bottom
"""
def bottom():
print("from bottom to top")
top()
def top():
print("from top to bottom")
bottom()
"""
from bottom to top
from top to bottom
"""
递归
def calc(n):
print(n)
calc(n)
calc(10)
#Wrong
import time
def calc(n):
print(n)
time.sleep(1)
calc(n)
calc(10)
#结果会不停输出10
递归的特性:
1、必须有一个明确的结束条件
满足某个条件 return
def calc(n):
print(n)
if int(n / 2) == 0:
return n
res = calc(int(n / 2))
return res
res = calc(10)
print(res)
"""
10
5
2
1
1
"""
2、递归的效率不高,递归层次过多会导致栈溢出。
作用域
def test01():
print("test")
def test02():
print("test2")
return 1
res = test02()
print(res)
# test2
# 1
def test1():
print("test1")
def test2():
print("test2")
return test1
res = test2()
print(res)
# test2
# <function test1 at 0x00000213CED9A510> 这是test
def test1():
print("test1")
def test2():
print("test2")
return test1
res = test2()
print(res())
# test2
# test1 这是test1()的执行过程
# None 这是因为没有return值所以添加的默认值
函数运行的结果与其定义有关,与其在哪里调用无关
def name1():
name = ""
def name2():
name = ""
def name3():
print(name)
return name3
return name2
z = name1()
print(z)
#<function name1.<locals>.name2 at 0x000001E8FFAFA488>
name2 = name1()
name3 = name2()
name3()
#2
name1()()()
# 2
Python学习(六)—— 函数、全局变量与局部变量的更多相关文章
- python学习8—函数之高阶函数与内置函数
python学习8—函数之高阶函数与内置函数 1. 高阶函数 a. map()函数 对第二个输入的参数进行第一个输入的参数指定的操作.map()函数的返回值是一个迭代器,只可以迭代一次,迭代过后会被释 ...
- python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程
python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...
- Python新手学习基础之函数-全局变量和局部变量
全局变量和局部变量 我们通常把定义在函数外的变量成为全局变量,定义在函数内的变量称为局部变量,顾名思义,全局变量的作用域是整个代码段,局部变量的作用域就只是在它所属的代码段,变量只在它的作用域里有效. ...
- Python学习--05函数
Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.我们已经知道Python提供了许多内建函数,比如print().但我们 ...
- Python之路 day3 全局变量、局部变量
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa """ 全局与局部变量 在子程序中定义的变量称为局部变 ...
- Python学习笔记 — 函数
函数是对程序逻辑进行结构化或过程化的一种编程方法.函数具有两个方面的意义:1)将代码分块,易于管理和阅读:2)最大化代码复用和最小化代码冗余,节省空间,有助于保持一致性. 1. 函数定义 Python ...
- Python学习笔记-函数基础
函数基础 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 为什么使用函数:减少重复代码.使程序变的可扩展使程序变得易维护 1.定义一个函数 #定 ...
- python 学习分享-函数篇
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...
- Day 10:函数全局变量和局部变量及函数嵌套
全局变量:在所有函数之外赋值的变量,是全局变量. 局部变量:在函数内的变量是,局部变量 一个函数被调用时,就创建了一个局部作用域.在这个函数内赋值的所有变量,存在于该局部作用域内.该函数返回时,这个局 ...
- Swift编程语言学习11—— 枚举全局变量、局部变量与类型属性
全局变量和局部变量 计算属性和属性监视器所描写叙述的模式也能够用于全局变量和局部变量,全局变量是在函数.方法.闭包或不论什么类型之外定义的变量,局部变量是在函数.方法或闭包内部定义的变量. 前面章节提 ...
随机推荐
- 【音乐欣赏】《I Do What I Want》 - Missio
曲名:I Do What I Want 作者:Missio [00:15.84]I wish I could party like I used to when I was young [00:21. ...
- 【网站】i新媒上线了!
[New]i新媒上线了! i新媒,是新媒体人常用和必备的工具导航,我们整合了自媒体平台.行业资讯.运营营销.学习创业等常用的网站,让新媒体人更快地获取有用的知识. 访问链接:https://ixm.h ...
- MyBatis 逆向工程——根据数据表自动生成model、xml映射文件、mapper接口
MyBatis Generator(MBG)的使用 MBG可以根据数据表生成对应的model.xml映射文件.mapper接口,只是简单的生成,还需要根据需求修改. 1.下载jar包 https:// ...
- JavaScript 开胃菜
注释 单行注释:// 快捷键: CTRL + / 多行注释: /* 内容 */ 快捷键: ctrl + shift + / 变量 申明变量 var name; 赋值 name = 'peach'; 初 ...
- mybatis-plus 错误
错误:java.lang.NoClassDefFoundError: org/apache/velocity/context/Context 原因: 缺少velocity的依赖 解决方案: <d ...
- 家庭记账小账本Android studio
经过长达7天多的时间,从Android studio的安装碰到很多的问题,真的很不走运,别人安装Android studio都是一气呵成,我的Android真的没话说 把自己的这些天的开发成果展示一下 ...
- Iris_xorm
xorm表基本操作及高级操作 表结构基本操作 对表结构的操作最常见的操作是查询和统计相关的方法,我们首先来看相关实现: 条件查询 Id值查询:参数接收主键字段的值.例如: var user User ...
- 使用 navigator.sendBeacon() 上报数据
http://kaifage.com/notes/76/navigator-sendBeacon.html 如某些统计系统,在页面unload时,如果要上报当前数据,采用xhr的同步上报方式,会阻塞当 ...
- eclipse 添加主題
在使用Eclipse过程中可能想更换下界面主题,此处介绍的是一款主题插件 Eclipse Color Theme 打开Eclipse,Help --> Eclipse Marketplace 在 ...
- 第二十五篇 玩转数据结构——链表(Linked List)
1.. 链表的重要性 我们之前实现的动态数组.栈.队列,底层都是依托静态数组,靠resize来解决固定容量的问题,而"链表"则是一种真正的动态数据结构,不需要处理固定容 ...