15 函数回调 模块

函数回调

提前写出函数的调用,再去考虑函数体的实现    怎么样提前写出函数的调用:在另一个函数中写出函数的调用   再去考虑函数体的实现:根据实际的需求
def my_sleep(sec):
    import time
    current_time = time.time()
    while time.time() - current_time < sec:
        pass

def download(fn=None):
    print(‘开始下载‘)
    my_sleep(1)
    data = ‘下载得到的信息‘
    print(‘下载完成‘)
    if fn:  # 如果外界提供了回调函数的实现体,再去调用,否则就只完成默认下载的功能
        res = fn(data)  # 下载成功的回调函数,具体完成什么事之后决定
        if res:
            print(‘操作成功‘)
            return True
        print(‘操作失败‘)
        return False
    return data  # 没有外界具体操作下载结果的功能代码,就将下载结果直接返回

# res = download()
# print(res)

def download_action(data):
    print(‘往文件中写‘)
    with open(‘1.txt‘, ‘w‘, encoding=‘utf-8‘) as f:
        f.write(data)
        return True
    return False

res = download(download_action)
print(res)

# 下载成功后的动作可以多样化
def download_action1(data):
    print(data)
    return True
res = download(download_action1)
print(res)

# 补充:
# 自定义sleep
def my_sleep(sec):
    import time
    current_time = time.time()
    while time.time() - current_time < sec:
        pass
print(000)

模块

模块:一系列功能的集合体定义模块:创建一个py文件就是一个模块,该py文件名就是模块名 使用模块:在要使用该模块功能的文件中导入模块,通过import关键字导入模块名

要求:

1.了解什么是模块 2.为什么要使用模块 3.import导入模块:名称空间 4.起别名:原名与别名 5.from导入方式 6.*的知识点 7.查询顺序 8.自启文件与模块的区别难点:循环导入
模块的四种存在方式:   1.使用python编写的.py文件(任何一个py文件都可以作为模块)   2.包:一堆py文件的集合体   3.使用C编写并链接到python解释器的内置模块   4.已被编译为共享库或DLL的C或C++扩展

优点:1.从文件级别组织代码,是同特性的功能能统一管理2.可以使用系统或第三方模块(拿来主义),来提高开发效率
module.py文件内容:
# 每一个py文件都是一个模块,py文件名module就是模块名
a = 100
# print(a)

def b():
    print(a)  # 局部中没有a,只能从全局或内置找
    # 注:如果自身文件的全局中有,就找自身的,否则就找内置,不会找导入它的文件全局中的名字

def c():
    global a
    a = 300
---------------------------module.py  内容结束-------------------------------

import module
# 导入模块,会编译执行成一个pyc文件,该pyc文件就是该模块的执行文件
# print(module)

# 再次导入,module该模块不会被执行了
import module
import module
import module
import module

# 导入模块: import module ③
# 1.编译执行模块所对应的py文件,形成对应的pyc文件
# 2.产生该模块自己的全局名称空间
# 3.在使用该模块的全局名称空间中产生一个名字(导入的模块名)
import module
aaaaa = module
import module
a = 888
module.b()

module.c()

print(aaaaa.a)

print(a)
# 注:
# 1.每一个文件都会产生自己的全局名称空间,且相互不影响
# 2.多次导入,只会编译执行模块一次,将其加载到内存,之后的都是直接对名字的引用

起别名

通过as关键字可以给模块起别名: 模块名一旦起别名,原模块名就不能再使用

  1.简化模块名字

  2.统一功能

  from 模板名 import 名字1 as 别名1, ..., 名字n as 别名n

#
import mmmmmmmmmmmmmmmmmm3 as my_m3
print(my_m3.num)

cmd = input(‘数据库选择 1:mysql | 2:oracle:‘)
if cmd == ‘1‘:
    import mysql as db
    # mysql.excuse()
else:
    import oracle as db
    # oracle.excuse()
db.excuse()
在任何地方都可以导入模块
def fn():
    global m3
    import m3  # 就是普通的名字,只是该名字执行的是一个py文件(全局名称空间)
    print(‘>>>‘, m3.num)
fn()
print(m3.num)

from导入

from 模块名 import 名字1, 名字2, ..., 名字n

  可以指名道姓导入模板中所有想导入的名字

from  模块名 import *

  导入的是模块中的__all__这个列表
  1、系统默认该列表不会收录_开头的名字
  2、可以自定义__all__列表来规定外界通过*可以导入的名字

  不建议直接导入 *,因为可读性差,且极容易出现变量重名
  模块中有 名字a
  可以使用模块中的a
  a = 20
  模块中的a就被覆盖了,且在代码上还不能直接看出

import m3, m4
import m3
import m4

# 在import后的名字才会在该文件的名称空间中产生
# from m4 import a, b, _c  # 指名道姓的可以导入_开头的名字

# 通过*导入: 可以将导入模块中的(除了以_开头的)名字一并导入
from m4 import *
# 通常不建议导入*,当需要使用模块中绝大部分名字时,才考虑导入*

print(a)
a()

# 两个py文件中的名字a都合理存在,
# 但import后的名字a和a=20,在一个名称空间中,只会保留最后一次值
a = 20
# a()
b()
print(a)

# _c()
print(_c)
# print(c)
# 一旦起别名,原名字就不能再用 from m5 import aaaaa as a, bbbbb as b, ccccc as c print(a) print(b) print(c)

自执行与模块区别

__name__:
1.在py文件作为模块被使用时,__name__为模块名
2.在py文件自执行时,__name__为字符串 ‘__main__‘

print("共有逻辑")
if __name__ == ‘__main__‘:
    # 所有自执行的逻辑
    print("m6: 我是自执行的")
    a = 10  # 产生的是全局的名字
else:
    # 所有模块的逻辑
    print("m6: 我被导入执行的")
    print(a)  # 会报错:走else就不可能走if,所以a压根没产生

大总结

模块的概念:一系列功能的集合体
为什么要使用模块:使用模块后的优点:1文件角度考虑代码,2拿来主义,提供开发效率
py中实现模块的方式:4种,重点:py文件

定义模块:新建一个py文件:文件名就是模块名,尽量采用全英文,可以结合数字与下划线
使用模块:可以不用起别名,但一旦起别名,原名字就不能再使用了
    -- import 模块名 as 别名
    -- from 模块名 import 名字 as 别名

自执行文件与模块区分:__name__
 

原文地址:https://www.cnblogs.com/zhouyongv5/p/10672904.html

时间: 2024-11-07 21:14:55

15 函数回调 模块的相关文章

递归、函数回调、字符的思考

1.函数指针类型做什么工作呢(起什么作用) 1)它规定了函数的"返回值和参数."只要是这种它所对应的返回值和参数类型的函数,它都可以调用起来. 2)回调函数是通过函数指针做函数参数实现的,"它的本质是:提前对函数的返回值和参数做了一个约定" 2.数组类型和数组指针指针类型 1)数组类型 int arr[10]; arr代表数组首元素地址: &arr代表整个数组首地址.虽然 arr 和 &arr 的值相同,但是他们的步长不同 2)数组类型 typede

[译] Python 2.7.6 标准库——15.1 os模块

该模块提供了一种使用依赖于操作系统函数的可移植方法.如果想读或写一个文件,参考open():如果想操作路径,参考os.path模块:如果想读取命令行中所有文件的所有行,参考fileinput模块.如果要创建临时文件和目录,参考tempfile模块.高级文件和目录处理则参考shutil模块. 注意函数的可用性: Python所有内置的依赖于操作系统的模块设计原则是:如果有相同的函数功能可用,则使用同一接口.例如,函数os.stat(path)以同一格式返回路径的stat信息(源于POSIX接口).

匿名函数、内置函数与模块

一.匿名函数 Python使用lambda来创建匿名函数,不再使用def语句这样标准的形式定义一个函数 lambda只是一个表达式,函数体比def简单很多 lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去 lambda函数拥有自己的名称空间,且不能访问自有参数列表之外或全局名称空间里的参数 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率 适合临时的一次性的使用场景 语法:

委托&amp;指针函数&amp;回调函数

委托 委托是一种数据类型,像类一样(可以声明委托类型变量)方法参数可以是int string 类类型. //1 //委托小结 //1 定义一个委托需要delegate关键字 //public delegate void WriteTimeToAny(); //2 委托用来存储的方法要与定义的委托类型相一致 //3 委托是一个数据类型,用时需要传递一个变量,可以使用关键字new也可以不使用 //使用委托的意义 //主要是注入代码,写入一个委托类型方法方便以后使用时可以用实现相应的功能 //2 //

函数回调以及函数指针

code 其实只是行为的一种描述,code可以编码成为data,将data解释运行的时候,也会变成code.code和data可以不用区分,统一称为信息. ##统一code.data的共性(数据和代码的统一) 有些语言不单可以传递函数,函数里面又用到一些外部信息(包括code, data).那些语言可以将函数跟函数所用到的信息一起传递存储. 这种将函数和它所用的信息作为一个整体,就为闭包. ### 闭包在swift语言中经常会用到. ### 将代码和数据打通,统一起来,是一个槛.比如一些修改自身

VBA基础 - 函数和模块

概要 对于一般的 VBA 程序来说, 可能一个或几个函数就行了. 毕竟, VBA 只是作为 excel 的辅助工具来用的. 但是, 随着 VBA 写的越来越多, 用个工程来管理就有必要了, 而一个代码工程的基础, 就是 函数 和 模块. 函数 VBA 的中的函数有 2 种, 一种是 Sub, 一种是 Function 在 VBA 中, 其实 Sub 叫过程, 不叫函数, 它们的区别有 2 个: Function 有返回值, Sub 没有 Sub 可以直接执行, Function 必须被调用才能执

怒学Python——第四篇——函数与模块

Python的函数:其实和C++非常类似,不过由于是弱类型的语言(用起来感觉是......),把那些类型声明都去掉了,传的是值不是引用(至少2.7是),有一点点小区别是前面必须加def来定义(好像宏定义的样子......),下面给出示例 def sum(a, b): #sum为函数名,注意冒号...... c = a + b #这一部分是函数的语句块 return c #到这里函数就结束了,和C++一样 print sum(1, 2) #根据函数名调用函数,输出1+2的值 这里也有lambda函

python 学习笔记day02-python循环、文件、函数、模块

循环语句 while 循环 while 循环语法结构 当需要语句不断的重复执行时,可以使用 while 循环 while expression: while_sutie 语句 while_suite 会被连续不断的循环执行,直到表达式的值变成 0 或 False         #!/usr/bin/env python         # -- coding: utf-8 --         sum100 = 0         counter = 1         while count

再议指针---------函数回调(qsort函数原理)

我们能否写一个这样的函数: 可以对任何类型数据排序 任何人在使用该函数不需要修改该函数代码(即:用户可以不必看到函数源 码,只会调用就行) 思考: 用户需要排序的数据的类型千变万化,可能是int型,也有可能是自定义的结构体类型,各种类型的大小比较规则是不一样的,这样看来实现一个这样全能的排序函数似乎不可能. 但具体需要排序的类型应按照什么规则确定大小只有使用该函数的用户最清楚,那我们可不可以把实现比较大小的功能交给用户来完成了,到时候用户只需告诉该函数比较规则(函数)在什么位置,这样排序函数不就