1、python全局变量相关概念及使用

来自菜鸟教程上的例子: http://www.runoob.com/python3/python3-function.html

一、python入参需要注意地方

a=1
def speak(a=None):
if a is None:
print('None')
else:
print(a)
speak()
None
speak(a=a)
1 class A():
def talk(self,filename=''):
if filename=='':
filename='filename'
print('take:',filename)
return filename def see(self,filename=None):
if filename is not None:
a='a'
print(a)
elif filename is None:
a='elif'
print('a:',a)
print('filename:',filename) def speak(self):
a=self.talk();print('a:',a)
print('-------------')
self.see()
print('-------------')
print('a:',a)
aa=A()
aa.speak() take: filename
a: filename
-------------
a: elif
filename: None
-------------
a: filename class A():
def talk(self,filename=''):
if filename=='':
filename='filename'
print('take:',filename)
return filename
def see(self,filename=None):
if filename is not None:
a='a'
print('a:',a)
elif filename is None:
a='elif'
print('a:',a)
print('filename:',filename)
def speak(self):
a=self.talk();print('a:',a)
print('-------------')
self.see(filename=a)
print('-------------')
print('a:',a)
aa=A()
aa.speak() take: filename
a: filename
-------------
a: a
-------------
a: filename

二、python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量在哪里赋值的。

变量的作用域决定了哪一部分程序可以访问哪个特定的变量名称。python的作用域一共有4中。分别是:

L(local)局部作用域;E(Enclosing)闭包函数外的函数中;G(Global)全局作用域;B(Built-in)内建作用域

# Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,
# 其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,
# 也就是说这这些语句内定义的变量,外部也可以访问,
if True:
msg='msg'
print(msg)
msg
#如果将 msg_new 定义在函数中,则它就是局部变量,外部不能访问:
def test():
msg_new='msg_new'
print(msg_new)
Traceback (most recent call last):
File "D:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2862, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-3-ac28ad2bc0fc>", line 4, in <module>
print(msg_new)
NameError: name 'msg_new' is not defined

二、全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,访问结束后销毁,而全局变量可以在整个程序范围内访问。

total=0
def sum(arg1,arg2):
total=arg1+arg2
print(total)
return total
sum(10,10)
print(total)
20
0 #函数sum内total=20变量销毁掉,打印最初赋值全局变量,total=0,如果没有total=0,则报错
total=0
def sum(arg1,arg2):
global total
total=arg1+arg2
print(total)
return total
sum(10,10)
print(total)
20
20

三、如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量,则需要nonlocal关键字,代码如下,比较两者区别。

def outer():
num=10
def inner():
num=100
print(num)
inner()
print(num)
outer()
100
10 def outer():
num=10
def inner():
nonlocal num #nonlocal关键字声明
num=100
print(num)
inner()
print(num)
outer()
100
100 #从上面代码10 变为100

2、什么是回调函数,感觉好复杂??存在的意义是什么?

1、知乎上的回答:https://www.zhihu.com/question/19801131

你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。回答完毕。

2、什么是回调:http://www.jb51.net/article/68797.htm

软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。

同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;

回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;

异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。

回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

同步调用时三者中最简单的,而回调又常常是异步调用的基础。

回调函数:通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。如下面的例子1:来源  https://www.cnblogs.com/hainan-zhang/p/6222552.html

下面例子:我猜测函数指针应该为function_name

def clean1(times):
"""
就假装扫地
param times :次数
return None
"""
print('已完成扫地次数:',times)
def clean2(times):
"""
假装洗抽油烟机
param times:次数
return: None
"""
print('已洗抽油烟机次数:',times)
def call_clean(times,function_name):
"""
这个很重要,就是家政公司的业务系统,要啥业务都得在这说
这个是实现回调函数的核心
param times:次数
param function_name:回调函数名
return:调用的函数结果
"""
return function_name(times)
call_clean(10,clean2) #call_clean(10,clean2)

这个例子介绍回调函数的使用,没有说明回调函数存在的意义?这样写还不如直接调用clean2函数10次。

下面在网上找的另外一个,例子2:http://blog.csdn.net/ma52103231/article/details/61432120

看着有点懵,难度大,换一个

class Callback:
def __init__(self,instance,function_name):
self.instance=instance
self.function_name=function_name
def action(self,params):
self.instance.__getattribute__(self.function_name)(params)
class Test:
def __init__(self):
self.clb=None
def register(self,clb):
self.clb=clb
def do_test(self):
params=[]
self.clb.action(params)
class Api:
def __init__(self,test_instance):
test_instance.register(Callback(self,self.function.__name__))
def function(self,params):
print('function')
t=Test()
a=Api(t)
t.do_test()
#function

例子3:http://blog.csdn.net/ma52103231/article/details/61432120

#called.py文件,为回调函数
def test_call(p_call):
print('in called.py test_call()')
b=p_call()
return b ###call.py文件,主程序
import called
def callback():
a=1
b=a+1
print('in callback')
return b
def main():
global x
#called.test()
x=called.test_call(callback)
print('in call.py')
main()
print(x) 运行主程序结果:
in called.py test_call()
in callback
in call.py
2

3、一个主程序脚本文件,main.py,一个回调函数脚本文件,pyCallBack.py,main.py调用pyCallBack.py,在回调函数中生成数据,现在想把数据传到主程序上来,该如何写?

解答:可以用return直接返回即可。如上面例子3

python全局变量、回调函数的更多相关文章

  1. python 自定义回调函数

    回调函数用起来比较爽.特别是在js中,满世界全是回调,那么在python中,怎么来优雅地实现自己的回调函数呢 下面贴一个我写的例子 class BaseHandler(object): def cra ...

  2. 对于Python中回调函数的理解

    关于回调函数,网上有很多说明和各种解释,多数在尝试用语言描述.我认为,如果对各个角色之间的关系不清楚,如果没有相关的编程需求,那么语言便非常无力,很难理解. 这是360百科的解释: 在计算机程序设计中 ...

  3. Python之回调函数

    在计算机程序设计中,回调函数,或简称回调(Callback),是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 有两种类型的回调函数:即bloc ...

  4. 初识python: 回调函数

    回调函数 简单理解就是:将一个函数通过参数的形式传递给另一个函数 #!/user/bin env python # author:Simple-Sir # time:2019/8/9 10:49 # ...

  5. python 的回调函数

    回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.有些库函数(library function)却 ...

  6. (十八)python 3 回调函数

    回调函数:把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的 ...

  7. python异步回调函数的实现

    #coding:utf-8 from socket import * import time #简单的服务器程序 监听用户连接,接收用户发来的信息,并返回反馈 def main(): HOST = & ...

  8. 项目记录 -- python调用回调函数

    C源文件: static int get_callback(zpool_handle_t *zhp, void *data) { zprop_get_cbdata_t *cbp = (zprop_ge ...

  9. Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程

    Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...

随机推荐

  1. linux网络编程之shutdown() 与 close()函数详解

    linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这 ...

  2. Dubbo的配置过程,实现原理及架构详解

    一. Dubbo是什么?Dubbo能做什么? 随着互联网的发展,市场需求快速变更,业务持续高速增长,网站早已从单一应用架构演变为分布式服务架构及流动计算架构.在分布式架构的背景下,在本地调用非本进程内 ...

  3. uboot源码分析1-启动第一阶段

    1.不简单的头文件包含 #include <config.h>:这个文件的内容其实是包含了一个头文件:#include <configs/x210_sd.h>". # ...

  4. 适配器之SimpleAdapter

    前言: 在写适配器时,SimpleAdapter会经常使用到,虽然他比ArrayAdapter复杂,但是也提供了更多的功能 正文: 我们接下来先从SimpleAdapter中较为简单的显示两行文本开始 ...

  5. liunx笔记

    Zolertia IPv6/6LoWPAN Ubidots client Son Han Border Router with Raspberry Pi for LLN with TelosBs Co ...

  6. Redis 详解 (三) redis的五大数据类型详细用法

    目录 1.string 数据类型 2.hash 数据类型 3.list 数据类型 4.set 数据类型 5.zset 数据类型 6.系统相关命令 7.key 相关命令 我们说 Redis 相对于 Me ...

  7. Flask的请求钩子与上下文简览

    请求钩子(Hook) 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在请求开始时,建立数据库连接:在请求结束时,指定数据的交互格式.为了让>每个视图函数避免编写重复功能的代 ...

  8. 七十九、SAP中数据库操作之更新数据,UPDATE的用法

    一.我们查看SFLIGHT数据库,比如我们需要改这条数据 二.代码如下 三.执行效果如下,显示“数据更新成功” 四.我们来看一下SFLIGHT数据库,发现已经由DEM更改为了AAA了

  9. 021-PHP常用的数值类型判断函数

    <?php //判断数组 $colors = array("red", "blue", "green"); if(is_array($ ...

  10. 127-PHP类通过魔术变量判断类中是否存在指定的方法

    <?php class ren{ //定义人类 //定义成员属性 private $name='Tom'; private $age=15; //定义成员方法 public function g ...