-
2021-04-13 19:19:13
python中模块和包的概念
1.模块
一个.py文件就是一个模块。这个文件的名字是:模块名.py。由此可见在python中,文件名和模块名的差别只是有没有后缀。有后缀是文件名,没有后缀是模块名。
每个文件(每个模块)都是一个独立的名称空间,也就是说可以在两个(多个)文件中出现同名的函数。
import,from.....import...两种导入的区别:
1.import
按模块区分拥有独立的命名空间,要是想使用模块中的函数需要使用 模块名.函数名 的方式来使用。
可以使用import.....as....为导入的模块起一个别名,在使用这个模块中的函数时,可以使用 别名.函数名。
2.from.....import...
将模块的内容导入到当前的命名空间中,直接使用名字就行。
如果,被导入的模块和当前的文件中有同名的函数,那么后者将会覆盖前者。
什么意思呢?
这个时候就要看from.....import... (from后面跟的是模块名,import后面跟的是具体的函数名,或是模块中具体的变量名等)出现的位置了,如果出现在当前模块函数之前,那么当前模块的函数会覆盖导入的函数,如果出现在当前函数定义之后,那么导入的函数会覆盖当前模块中的函数。
from.....import......可以接受as为导入的函数或是变量起别名,同样可以导入多个函数、变量等。
from......import * 不建议使用这个方式导入模块,可能覆盖之前同名的函数等(这种方式不会导入以_开头的变量或函数)。
3.共同点
python中不支持重新加载或卸载之前的导入的模块,因此如果修改被导入的模块,需重新启动python程序或者是使用重新加载语句来实现
import importlib; importlib.reload(modulename)
。当一个模块被导入时,他的全局变量名__name__ 为模块名,当这个模块当做脚本执行时,全局变量名__name__为 __main__。
模块的查找顺序:内存中已经加载的模块->内置模块->sys.path路径中包含的模块。(所以我们自己开发模块时,注意不要和已有的模块名重复)
2.包
包的本质就是一个包含__init__.py文件的目录。是一种通过使用‘.模块名’来组织python模块名称空间的方式,也就是说在在导入包时遇到带 点 的,这就是关于包的导入语法。
导入包,本质上是导入了包中的__init__.py文件。
包的导入形式也有,import 和 from.....import......两种形式。
3.提示
import *
会导入除了以_
开头的所有变量,但是如果定义了__all__
,那么会导入__all__
中列出的东西。__all__是模块中的全局变量,列表
更多相关内容 -
python添加模块搜索路径和包的导入方法
2020-12-24 12:43:19方法一:函数添加 1 import sys 2 查看sys.path 3 添加sys.path.append(“c:\\”) 方法二:修改环境变量 w用户可以修改系统环境变量PYTHONPATH 方法三:增加.pth文件,推荐! 在site-packages添加一个路径文件,如... -
移动和包NFC
2018-08-20 16:56:04移动和包NFC -
Python中模块(Module)和包(Package)的区别详解
2020-09-18 21:36:05主要介绍了Python中模块(Module)和包(Package)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
Oracle_plsql讲义:第22章 创建子程序和包.ppt
2021-09-17 23:27:43Oracle_plsql讲义:第22章 创建子程序和包.ppt -
用Linux实现路由器和包过滤防火墙
2020-03-04 10:31:45路由器是一种广泛运用在IP网段之间的设备,市场上有许多现成的产品。在应用中,我 们经常将路由器跨接在广域网和局域网之间,大多数的路由器产品也就是基于这种需要来设计的。但是随着用户IP网络的扩展,我们需要一... -
Python中的模块和包
2020-12-20 23:36:48Python中的模块和包 文章目录Python中的模块和包一、类属性和类方法01. 类的结构1.1 术语 —— 实例1.2 类是一个特殊的对象02. 类属性和实例属性2.1 概念和使用2.2 属性的获取机制03. 类方法和静态方法3.1 类方法3.2... -
第三方和包支付的实现
2015-08-01 12:38:26订单支付:即用户在网上购物时向商家支付订单货款的工具,具备从用户账户(和包账户或银行卡账户)扣款并划入商户和包账户的能力,适用于网上购物付款、应用下载付费、定期扣款等多种应用场景。 -
modulepackage:PyCon2015 教程“模块和包”的材料
2021-06-14 02:05:12模块和包:生与死 PyCon'2015 上的教程演示。 2015 年 4 月 9 日。蒙特利尔。 大卫·比兹利 (@dabeaz), ://www.dabeaz.com 本教程假设使用 Python 3.4 或更新版本。 第 8 节和第 9 节中的某些示例需要使用 Python... -
中国移动和包支付接口封装
2016-09-21 17:33:30vs开发环境中国移动和包支付接口封装 -
Python程序设计入门(4)模块和包
2021-01-21 17:28:53Python语言功能非常强大,除了类之外,还有模块和包的概念,这有点像perl,此处简单说说包和模块。 一、Python中的模块 模块——其实就是我们说的库(lib)的概念,不过它不仅只是可以包含一系列函数,也可以包含类,... -
PL/SQL 包头和包体
2021-05-08 16:47:17包用于逻辑组合相关的过程和函数,它由包规范和包体两部分组成,包规范用于定义公用的常量变量,过程和函数,在SQL*PLUS中建立包规范可以使用CREATE PACKAGE命令。实例如下:CREATE OR REPLACE PACKAGE emp_pkg IS...包用于逻辑组合相关的过程和函数,它由包规范和包体两部分组成,包规范用于定义公用的常量
变量,过程和函数,在SQL*PLUS中建立包规范可以使用CREATE PACKAGE命令。
实例如下:
CREATE OR REPLACE PACKAGE emp_pkg IS
PROCEDURE update_sal(name VARCHAR2,newsal NUMBER);
FUNCTION annual_incom(name VARCHAR2) RETURN NUMBER;
END;
包头值包含了过程和函数的说明,而没有过程和函数的实现代码。包体用于实现包规范中的过程和函数,
在SQL*PLUS中建立包体可以使用CREATE PACKAGE BODY命令。实例如下:
CREATE OR REPLACE PACKAGE BODY EMP_PKG IS
PROCEDURE update_sal(name VARCHAR2,newsal NUMBER)
IS
BEGIN
UPDATE EMP set sal=newsal
where lower(ename)=lower(name);
end;
FUNCTION annual_incom(name VARCHAR2) return number
IS
annual_salary NUMBER(7,2);
begin
select sal*12 + nvl(comm,0) INTO annual_salary
from emp where lower(ename)=lower(name);
RETURN annual_salary;
end;
end;
当调用包的过程和函数时,在过程和函数名之前必须要带有包名作为前缀(包名.子程序名),
而如果要访问其他方案的包,还必须要加方案名作为前缀(方案名.包名.子程序名).
SQL> set serveroutput on
SQL> exec emp_pkg.update_sal('scott',1500);
PL/SQL procedure successfully completed.
SQL> select emp_pkg.annual_incom('scott') from dual;
EMP_PKG.ANNUAL_INCOM('SCOTT')
-----------------------------
18000
oracle 学习(五)pl/sql语言存储过程&;包
首先搞清楚俩概念 存储过程(procedure)&程序包(package) 存储过程:数据库对象之一,可以理解为数据库的子程序,在客户端和服务器端可以直接调用它.触发器是与表直接关联的特殊存储 ...
Oracle数据库之开发PL/SQL子程序和包
Oracle数据库之开发PL/SQL子程序和包 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保 ...
PL/SQL重新编译包无反应案例2
在这篇"PL/SQL重新编译包无反应"里面介绍了编译包无反应的情况,今天又遇到一起案例, 在测试环境中,一个包的STATUS为INVALID,重新编译时,一直处于编译状态,检查发现 ...
PL/SQL重新编译包无反应
前几天碰到一个有趣的事情:早上同事执行一个包很久没有反应,就中断了执行,发邮件让我帮忙查看具体情况,我用PL/SQL Developer登录后,找到这个包的过程中发现这个包的图标有红色叉叉,也就是说这 ...
二十三、oracle pl/sql分类三 包
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成.1).我们可以使用create package命令来创建包,如:i.创建一个包sp_packageii.声明该包有一个过程update_sal ...
pl/sql学习(4): 包package
本文简单介绍包, 目前来看我用的不多, 除了之前 为了实现 一个procedure 的输出参数是结果集的时候用到过 package. 概念: 包是一组相关过程.函数.变量.常量和游标等PL/SQL程序 ...
开发PL/SQL子程序和包及使用PL/SQL编写触发器、在JDBC中应用Oracle
1. 子程序的各个部分: 声明部分.可执行部分.异常处理部分(可选) 2.子程序的分类: A. 过程 - 执行某些操作 a. 创建过程的语法: CREATE [OR REPLACE] PROC ...
pl/sql基础知识—包
n 包 包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成. 为什么需要包:使用包可以更好的管理自己写的函数.过程 ①我们可以使用create package命令来创建包: creat ...
Oracle PL/SQL编程之包(packages)
1.简介 包用于在逻辑上组合过程和函数,它由包规范和包体组成. 我们可以使用create package来创建包,代码如下: ok,包创建完成,通过包的代码发现包的功能就是申明包中包含的过程和方法,红 ...
随机推荐
Net重温之路一
简述: 最简单的 Hello World 准备: 工具:VS2013 + SqlServer 2008 R2 我们将以.NET Framework 4.5 为基准 开始: 一:新建解决方案 > ...
9,SFDC 管理员篇 - 安全设置
1, 使用Profile控制权限 (整体层面) Setup | Manage Users | Profiles 总结下,一个用户只能有一个Profile,但是可以有多个Permission S ...
fineui框架
http://fineui.com/demo/#/demo/layout/fit.aspx 虽然比较丑陋,但功能实用 此框架比较简单, 框架的作用你懂的,重点是要有帮助文档, 进阶型的容易上手的帮助文 ...
AC题目简解-dp
dp类:A - Bridging signals ZOJ 3627 POJ1631 HDU1950给出一个从1-n的数字排列,求最长上升子序列长度.直接说解法吧.新开一个数组d,d[i]表示的是能构成 ...
HDU 1079 Calendar Game 博弈
题目大意:从1900年1月1日 - 2001年11月4日间选择一天为起点,两个人依次进行两种操作中的任意一种,当某人操作后为2001年11月4日时,该人获胜.问先手是否获胜 操作1:向后移一天 操作2 ...
Java并发编程笔记——技术点汇总
目录 · 线程安全 · 线程安全的实现方法 · 互斥同步 · 非阻塞同步 · 无同步 · volatile关键字 · 线程间通信 · Object.wait()方法 · Object.notify() ...
oracle入坑日记<;一>; 安装
学习日记系列(前辈/大神勿喷) 一.下载 下载地址:http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads ...
android 给LinearLayout中添加一定数量的控件,并让着一定数量的控件从右到左移动,每隔若干秒停顿一下,最后一个view链接第一个view,然后继续移动循环往复,形成一个死循环简单动画效果
主类:IndexAnimationLinearLayout.java package com.yw.sortlistview; import java.util.ArrayList; import j ...
「PKUWC2018」Minimax
题面 题解 强势安利一波巨佬的$blog$ 线段树合并吼题啊 合并的时候要记一下$A$点权值小于$l$的概率和$A$点权值大于$r$的概率,对$B$点同样做 时空复杂度$\text O(nlogw)$ ...
Out of memory due to hash maps used in map-side aggregation解决办法
在运行一个group by的sql时,抛出以下错误信息: Task with the most failures(4): -----Task ID: task_201411191723_723592 ...
-
盐水法和包灰法腌制咸蛋理化性质的比较 (2011年)
2021-05-24 22:53:28研究了盐水法和包灰法在腌制咸蛋过程中理化品质的变化。结果表明:盐水法腌制的咸蛋黄的DHA含量是包灰法腌制的2倍多,而硬脂酸含量只有包灰法的2/3,其他脂肪酸没有明显差异。两种腌制方法的蛋黄和蛋清蛋白质种类... -
python 零基础学习篇面向对象编程模块和包18 模块和包的总结.mp4
2022-04-21 13:50:03python 零基础学习篇 -
对象图和包图
2014-11-11 21:58:56对象图和包图 对象和包ppt 对象图和包图的详细介绍 -
Android applicationId和包名的区别总结
2020-08-25 22:42:15主要给大家介绍了关于Android applicationId和包名的区别,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 -
python模块和包的应用BASE_PATH使用解析
2020-12-23 10:42:36这篇文章主要介绍了python模块和包的应用BASE_PATH使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python中的模块(module)是管理python应用程序的工具... -
如何把matlab代码封装-SegwormMatlabClasses:重写了Segworm代码以使用Matlab类和包
2021-05-24 02:25:18此版本的代码试图通过使用类和包来更好地封装功能来重写/清理代码。 从2014年9月开始,这个仓库的想法很快就会被完全移植到Python中。 项目状态 视频转归一化蠕虫:未完成,当前工作于 将蠕虫归一化为特征:已完成,... -
MyEclipse9或10添加SVN教程和包及svn服务器软件
2013-08-29 12:15:16MyEclipse9或10添加SVN教程和包及svn服务器软件 二个版本svn的包 doc教程 和制作svn服务器的软件 超值svn集合大礼包 -
Oracle进阶(六)包(Package)和包体
2021-04-27 20:12:53包由两部分组成:包规范(PACKAGE)和包体(PACKAGE BODY)。 包规范是包的说明部分,是对外的操作接口(类似java接口),对应用是可见的。 包体是包的代码和实现部分(类似java实现类),对应用来说是不可见的。1、包(Package)概述
包(Package)是用来存储相关程序结构的对象,它存储于数据字典中。包由两部分组成:包规范(PACKAGE)和包体(PACKAGE BODY)。
包规范是包的说明部分,是对外的操作接口(类似java接口),对应用是可见的。
包体是包的代码和实现部分(类似java实现类),对应用来说是不可见的。
1.1 包说明
公有元素(PUBLIC) 在包头中说明,在包体中具体定义。在包外可见并可以访问,对整个应用的全过程有效。
私有元素(PRIVATE) 在包体的说明部分说明。只能被包内部的其他部分访问。
局部变量(LOCAL) 在过程或函数的说明部分说明。只能在定义变量的过程或函数中使用。1.2 系统包
包名称 描述 DBMS_OUTPUT 在SQL*Plus环境下输出信息 DBMS_DDL 编译过程函数和包 DBMS_SESSION 改变用户的会话,初始化包等 DBMS_TRANSACTION 控制数据库事务 DBMS_MAIL 连接Oracle*Mail DBMS_LOCK 进行复杂的锁机制管理 DBMS_ALERT 识别数据库事件告警 DBMS_PIPE 通过管道在会话间传递信息 DBMS_JOB 管理Oracle的作业 DBMS_LOB 操纵大对象 DBMS_SQL 执行动态SQL语句 2、基本语法
2.1 创建包和包体
1.创建包规范语法: CREATE [OR REPLACE] PACKAGE 包名 IS|AS --变量(VARIABLE)定义 --常量(CONSTANT)定义 --游标(CURSOR)定义 --类型(TYPE)定义 --函数定义 FUNCTION 函数名 [(参数列表)] RETURN 返回类型; --存储过程定义 PROCEDURE 存储过程名 [(参数列表)]; 异常(EXCEPTION) END [包名]; 2.创建包体语法: CREATE [OR REPLACE] PACKAGE BODY 包名 IS|AS --... --函数实现 FUNCTION 函数名 [(参数列表)] RETURN 返回类型 IS|AS --函数实现内容 --存储过程实现 PROCEDURE 存储过程名 [(参数列表)] IS|AS --存储过程实现内容 END [包名];
2.2 其它语法
--1 删除包规范 DROP PACKAGE 包规范名 --2 删除包体 DROP PACKAGE BODY 包体名 --3 重新编译包头 ALTER PACKAGE 包名 COMPILE PACKAGE --4 重新编译包体 ALTER PACKAGE 包名 COMPILE PACKAGE BODY
2.3 注意要点
1 包说明和包体必须有相同的名字
2 包的开始没有BEGIN语句,与存储过程和函数不同。
3 在包的说明部分定义函数和过程的名称和参数,具体实现在包体中定义。
4 在包内声明常量、变量、类型定义、异常、及游标时不使用DECLARE。
5 包内的过程和函数的定义不要CREATE OR REPLACE语句。
6 包定义和包体两者分离。
7 只有当包头编辑成功后才能编辑包体。
8 函数名与过程名须和包头中的函数过程一样。3、包的应用
以下所涉及的表,请查看Oracle进阶(三)常用函数的附表。
3.1 包创建
CREATE OR REPLACE PACKAGE EMP_PK --包定义部分 IS --公有变量:员工人数 V_EMP_COUNT NUMBER(5); --公有过程:初始化数据 PROCEDURE INIT(P_MAX NUMBER,P_MIN NUMBER); --公有过程:显示员工列表 PROCEDURE LIST_EMP; --公有过程:新增员工 PROCEDURE INSERT_EMP(P_EMPNO NUMBER,P_ENAME VARCHAR2,P_JOB VARCHAR2,P_SAL NUMBER); --公有过程:删除员工 PROCEDURE DELETE_EMP(P_EMPNO NUMBER); --公有过程:修改员工工资 PROCEDURE CHANGE_EMP_SAL(P_EMPNO NUMBER,P_SAL NUMBER); END EMP_PK; / CREATE OR REPLACE PACKAGE BODY EMP_PK --包体部分 IS --私有变量:输出信息 V_MESSAGE VARCHAR2(50); --私有变量:可修改工资上限 V_MAX_SAL NUMBER(7); --私有变量:可修改工资下限 V_MIN_SAL NUMBER(7); --私有函数:判断员工是否存在 FUNCTION EXIST_EMP(P_EMPNO NUMBER) RETURN BOOLEAN; --私有过程:显示信息 PROCEDURE SHOW_MESSAGE; --INIT PROCEDURE INIT(P_MAX NUMBER,P_MIN NUMBER) IS BEGIN SELECT COUNT(*) INTO V_EMP_COUNT FROM EMP; V_MAX_SAL:=P_MAX; V_MIN_SAL:=P_MIN; V_MESSAGE:='初始化数据已完成!'; SHOW_MESSAGE; END INIT; --LIST_EMP PROCEDURE LIST_EMP IS BEGIN DBMS_OUTPUT.PUT_LINE('姓名 职务 工资'); FOR EMP_REC IN (SELECT ENAME,JOB,SAL FROM EMP) LOOP DBMS_OUTPUT.PUT_LINE(RPAD(EMP_REC.ENAME,10,' ')||RPAD(EMP_REC.JOB,10,' ')||TO_CHAR(EMP_REC.SAL)); END LOOP; DBMS_OUTPUT.PUT_LINE('员工总人数'|| V_EMP_COUNT); END LIST_EMP; --INSERT_EMP PROCEDURE INSERT_EMP(P_EMPNO NUMBER,P_ENAME VARCHAR2,P_JOB VARCHAR2,P_SAL NUMBER) IS BEGIN IF NOT EXIST_EMP(P_EMPNO) THEN INSERT INTO EMP(EMPNO,ENAME,JOB,SAL)VALUES(P_EMPNO,P_ENAME,P_JOB,P_SAL); COMMIT; V_EMP_COUNT:=V_EMP_COUNT+1; V_MESSAGE:='员工'||P_EMPNO||'已新增!'; ELSE V_MESSAGE:='员工'||P_EMPNO||'已存在,不能新增!'; END IF; SHOW_MESSAGE; EXCEPTION WHEN OTHERS THEN V_MESSAGE:='员工'||P_EMPNO||'新增失败!'; SHOW_MESSAGE; END INSERT_EMP; --DELETE_EMP PROCEDURE DELETE_EMP(P_EMPNO NUMBER) IS BEGIN IF EXIST_EMP(P_EMPNO) THEN DELETE FROM EMP WHERE EMPNO=P_EMPNO; COMMIT; V_EMP_COUNT:=V_EMP_COUNT-1; V_MESSAGE:='员工'||P_EMPNO||'已删除!'; ELSE V_MESSAGE:='员工'||P_EMPNO||'不存在,不能删除!'; END IF; SHOW_MESSAGE; EXCEPTION WHEN OTHERS THEN V_MESSAGE:='员工'||P_EMPNO||'删除失败!'; SHOW_MESSAGE; END DELETE_EMP; --CHANGE_EMP_SAL PROCEDURE CHANGE_EMP_SAL(P_EMPNO NUMBER,P_SAL NUMBER) IS BEGIN IF (P_SAL>V_MAX_SAL OR P_SAL<V_MIN_SAL) THEN V_MESSAGE:='工资超出修改范围!'; ELSIF NOT EXIST_EMP(P_EMPNO) THEN V_MESSAGE:='员工'||P_EMPNO||'不存在,不能修改工资!'; ELSE UPDATE EMP SET SAL=P_SAL WHERE EMPNO=P_EMPNO; COMMIT; V_MESSAGE:='员工'||P_EMPNO||'工资已经修改!'; END IF; SHOW_MESSAGE; EXCEPTION WHEN OTHERS THEN V_MESSAGE:='员工'||P_EMPNO||'工资修改失败!'; SHOW_MESSAGE; END CHANGE_EMP_SAL; --SHOW_MESSAGE PROCEDURE SHOW_MESSAGE IS BEGIN DBMS_OUTPUT.PUT_LINE('提示信息:'||V_MESSAGE); END SHOW_MESSAGE; --EXIST_EMP FUNCTION EXIST_EMP(P_EMPNO NUMBER) RETURN BOOLEAN IS --局部变量:员工数量 V_NUM NUMBER; BEGIN SELECT COUNT(*) INTO V_NUM FROM EMP WHERE EMPNO=P_EMPNO; IF V_NUM=1 THEN RETURN TRUE; ELSE RETURN FALSE; END IF; END EXIST_EMP; END EMP_PK;
3.2 包调用
--调用包 --1 初始化 BEGIN EMP_PK.INIT(P_MAX => 200, P_MIN => 100); END; --2 员工列表 CALL EMP_PK.LIST_EMP(); --3 新增员工 CALL EMP_PK.INSERT_EMP(2021,'一二山人','YESR',10000); --4 查看员工人数 BEGIN DBMS_OUTPUT.PUT_LINE(EMP_PK.V_EMP_COUNT); END; --5 删除员工 CALL EMP_PK.DELETE_EMP(2021); --6 修改工资 CALL EMP_PK.CHANGE_EMP_SAL(7900,150); --7 授权其他用户调用包 GRANT EXECUTE ON EMP_PK TO SYS; --8 其它用户SYS调用包 CALL SCOTT.EMP_PK.INIT(400,300);
4、包的进阶
4.1 包重载创建
CREATE OR REPLACE PACKAGE EMP_OVERLOAD_PK IS --过程:新增部门 PROCEDURE INSERT_DEPT ( P_DEPTNO DEPT.DEPTNO%TYPE, --部门编号 P_DNAME DEPT.DNAME%TYPE, --部门名称 P_LOC DEPT.LOC%TYPE --位置 ); --过程:新增部门(重载) PROCEDURE INSERT_DEPT ( P_DEPTNO DEPT.DEPTNO%TYPE, --部门编号 P_DNAME DEPT.DNAME%TYPE --部门名称 ); --函数:获取员工加薪 FUNCTION GET_ADDSALARY (P_EMPNO EMP.EMPNO%TYPE) RETURN NUMBER; --函数:获取员工加薪(重载) FUNCTION GET_ADDSALARY (P_ENAME EMP.ENAME%TYPE) RETURN NUMBER; END EMP_OVERLOAD_PK; / CREATE OR REPLACE PACKAGE BODY EMP_OVERLOAD_PK IS FUNCTION EXIST_DEPT(P_DEPTNO DEPT.DEPTNO%TYPE) RETURN NUMBER; --INSERT_DEPT PROCEDURE INSERT_DEPT ( P_DEPTNO DEPT.DEPTNO%TYPE, P_DNAME DEPT.DNAME%TYPE, P_LOC DEPT.LOC%TYPE ) AS BEGIN IF EXIST_DEPT(P_DEPTNO) > 0 --如果部门存在 THEN --抛出异常 RAISE_APPLICATION_ERROR (-2021, '出现了相同的员工记录'); END IF; INSERT INTO DEPT(DEPTNO, DNAME, LOC) VALUES (P_DEPTNO, P_DNAME, P_LOC);--新增 COMMIT; END INSERT_DEPT; --INSERT_DEPT(重载) PROCEDURE INSERT_DEPT ( P_DEPTNO DEPT.DEPTNO%TYPE, P_DNAME DEPT.DNAME%TYPE ) AS BEGIN IF EXIST_DEPT(P_DEPTNO) > 0 --如果部门存在 THEN --抛出异常 RAISE_APPLICATION_ERROR (-2022, '出现了相同的员工记录'); END IF; INSERT INTO DEPT(DEPTNO, DNAME, LOC) VALUES (P_DEPTNO, P_DNAME, '广州天河区');--新增记录 COMMIT; END INSERT_DEPT; --GET_ADDSALARY FUNCTION GET_ADDSALARY (P_EMPNO EMP.EMPNO%TYPE) RETURN NUMBER IS V_JOB EMP.JOB%TYPE; V_SAL EMP.SAL%TYPE; V_SALARYRATIO NUMBER (10, 2);--调薪比率 BEGIN --获取员工表中的薪资信息 SELECT JOB, SAL INTO V_JOB, V_SAL FROM EMP WHERE EMPNO = P_EMPNO; CASE V_JOB WHEN 'CLERK' THEN V_SALARYRATIO := 1.05; WHEN 'SALESMAN' THEN V_SALARYRATIO := 1.1; WHEN 'MANAGER' THEN V_SALARYRATIO := 1.2; ELSE V_SALARYRATIO := 1; END CASE; IF V_SALARYRATIO <> 1 THEN RETURN ROUND(V_SAL * V_SALARYRATIO,2); ELSE RETURN V_SAL; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN 0; END GET_ADDSALARY; --GET_ADDSALARY(重载) FUNCTION GET_ADDSALARY (P_ENAME EMP.ENAME%TYPE) RETURN NUMBER IS V_JOB EMP.JOB%TYPE; V_SAL EMP.SAL%TYPE; V_SALARYRATIO NUMBER (10, 2);--调薪比率 BEGIN --获取员工表中的薪资信息 SELECT JOB, SAL INTO V_JOB, V_SAL FROM EMP WHERE ENAME = P_ENAME; CASE V_JOB WHEN 'CLERK' THEN V_SALARYRATIO := 1.05; WHEN 'SALESMAN' THEN V_SALARYRATIO := 1.1; WHEN 'MANAGER' THEN V_SALARYRATIO := 1.2; ELSE V_SALARYRATIO := 1; END CASE; IF V_SALARYRATIO <> 1 THEN RETURN ROUND(V_SAL * V_SALARYRATIO,2); ELSE RETURN V_SAL; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN 0; END GET_ADDSALARY; --私有函数:部门是否存在 FUNCTION EXIST_DEPT(P_DEPTNO DEPT.DEPTNO%TYPE) RETURN NUMBER AS V_COUNT NUMBER(2); BEGIN SELECT COUNT(*) INTO V_COUNT FROM DEPT WHERE DEPTNO=P_DEPTNO; RETURN V_COUNT; END; END EMP_OVERLOAD_PK;
4.2 包重载调用
--调用 BEGIN EMP_OVERLOAD_PK.INSERT_DEPT(50,,); END --重载过程 BEGIN EMP_OVERLOAD_PK.INSERT_DEPT(P_DEPTNO => 50, P_DNAME =>'交付二部', P_LOC => '海珠区'); END; --过程 BEGIN EMP_OVERLOAD_PK.INSERT_DEPT(P_DEPTNO => 60, P_DNAME =>'交付一部'); END; ----重载函数 DECLARE V_SAL NUMBER(10,2); BEGIN V_SAL:=EMP_OVERLOAD_PK.GET_ADDSALARY(7369); DBMS_OUTPUT.PUT_LINE('获取员工加薪'|| V_SAL); END; --函数 DECLARE V_SAL NUMBER(10,2); BEGIN V_SAL:=EMP_OVERLOAD_PK.GET_ADDSALARY('SMITH'); DBMS_OUTPUT.PUT_LINE('获取员工加薪'|| V_SAL); END;
-
吸附交联法和包埋法固定壳聚糖酶的比较研究* (2007年)
2021-05-10 07:02:45采用吸附交联和包埋法对假单胞菌(Pseudomonas)CUY8产壳聚糖酶进行固定,并对游离壳聚糖酶和2种固定化酶的特性进行比较。游离壳聚糖酶的最佳pH值为5.0,最佳温度为55℃;采用吸附交联方法所获得的壳聚糖酶的最佳pH... -
Python虚拟环境的创建和包下载过程分析
2020-09-16 16:05:59主要介绍了Python虚拟环境的创建和包下载,本文通过实例给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 -
degraph:测试和可视化并管理JVM字节码中的类和包的依赖关系(考虑Scala和Java)
2021-04-14 19:42:30Degraph是用于可视化和测试JVM应用程序中的类和包依赖关系的工具。 您可以它,或阅读。 如何建造 我对贡献非常感兴趣,因此,如果您有兴趣,请给我发消息,直到我回复为止,然后看看源代码。 Degraph使用gradle... -
插件和包
2019-04-09 01:23:14NULL 博文链接:https://xiii.iteye.com/blog/1631004 -
python的模块和包的详细说明
2020-06-09 21:37:42库是参考其他编程语言的说法,是指完成一定功能的代码集合,在python中的形式就是模块和包。 四、包的导入 导入包的本质:导入一个包就是执行包下的__init__.py文件 只要一个文件夹下面有个 init.py 文件,那么这个...python
一、模块
相信使用过Python编写代码的同学,会经常在文件头看到这样的import …,是的,这就是导入模块的语句,而每一个后缀名为.py的文件都是一个模块。
import jieba import os
1. 什么是模块?
逻辑上来说模块是一组功能的组合;实质上一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
import加载的模块分为四个通用类别:
a. 使用python编写的代码(.py文件);
b. 已被编译为共享库或DLL的C或C++扩展;
c. 包好一组模块的包
d. 使用C编写并链接到python解释器的内置模块;
如何使用模块?
想要使用模块,必须先要将模块加载进来,可以通过关键字 import 或 from进行加载;需要注意的是模块和当前文件在不同的命名空间中。2. 模块的构成:
模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句)
二、模块的导入
1、导入整个模块
比如我们有一个myModule的文件夹,里面有一个first.py文件,文件中的内容如下
a = 1 def myfun(s): print(s + 1)
在myModule的文件夹下打开终端/cmd,输入python进入命令行交互模式
写完模块导入的语句之后,接着就可以调用该模块下的函数了。调用方式为>>> import first >>> a Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'a' is not defined >>> first.a 1 >>> first.myfun(2) 3
2、导入特定的函数/变量所以说first.py文件就是一个模块,可以用import导入,里面变量和方法都要用first.前缀来引用,如果想不使用这个前缀或是我们只是想要使用模块中的某个函数,就可以只导入该变量或函数。导入方式为:from module_name import function_name。
如果导入的是变量,就可以直接输入变量名来获得变量的值;如果直接导入的是函数,可以直接使用function_name() 的方式调用函数,无需在函数名前面加上模块名。# 导入变量 >>> from first import a >>> a 1 # 导入函数 >>> from first import myfun >>> myfun(3) 4 # 一次导入多个变量 >>> from first import a,myfun >>> a 1 >>> myfun(5) 6 # 导入模块中全部变量 >>> from first import * >>> a 1 >>> myfun(5) 6 >>>
3、使用as给模块指定别名
可以在后面使用as给函数指定别名。句式如:import module_name as new_name,
>>> import first as f >>> f.a 1 >>> f.myfun(6) 7
在上述导入函数的基础上,可以在后面用as语句给导入的函数指定别名。句式如:from module_name import function_name as new_function。
>>> from first import myfun as add >>> add(8) 9
三、模块、包、库的区别
模块(module) 其实就是py文件,里面定义了一些函数、类、变量等。
包(package) 是多个模块的聚合体形成的文件夹,里面可以是多个py文件,也可以嵌套文件夹。
库是参考其他编程语言的说法,是指完成一定功能的代码集合,在python中的形式就是模块和包。四、包的导入
导入包的本质:导入一个包就是执行包下的__init__.py文件
只要一个文件夹下面有个 init.py 文件,那么这个文件夹就可以看做是一个包。
包导入的过程和模块的基本一致,只是导入包的时候会执行此包目录下的 init.py 而不是模块里面的语句了。另外,如果只是单纯的导入包,而包的 init.py 中又没有明确的其他初始化操作,那么此包下面的模块是不会自动导入的。
下面我们来实操进行说明
在myModule文件夹中新建folder文件夹,先cd进入myModule文件夹,在mkdir folder新建folder文件夹
xws@MHQ0063 myModule % mkdir folder
我们想让folder文件夹成为一个包。文件夹里新建abcd.py文件,输入vi abcd.py,文件中内容如下
b = 2 class Myclass: def __init__(self, name, age): self.name = name self.age = age def get_info(self): print('my name is {name} and age is {age}'.format(name = self.name, age = self.age))
esc–>:wq退出保存
此时在folder文件夹中新建一个__init__.py文件,否则程序会将这个文件夹当成普通文件夹来处理而不是一个包。这个__init__.py文件中可以什么都不填。上面步骤操作下来,文件结构如下
我们还是在myModule文件夹下打开命令行,进入python交互模式>>> import folder >>> folder.abcd.b Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'module' object has no attribute 'abcd' # 只是导入包不能随便使用其中的模块,要导入到具体模块或者变量的层次 >>> from folder import abcd >>> bob = abcd.Myclass(name = 'Bob', age = 20) >>> bob.name 'Bob' >>> bob.get_info() my name is Bob and age is 20 >>> from folder.abcd import b >>> b 2 >>> import folder.abcd >>> abcd.b 2 >>> import folder.abcd as a >>> a.b 2
注意:
- 只是导入包不能随便使用其中的模块,要导入到具体模块或者变量的层次
- 文件夹与文件之间可以用.也可以用from import格式,而文件与里面的变量之间只能用from import格式,即不能import folder.abcd.b
特殊的__init__.py文件
init.py文件其实是一个特殊的文件,它相当于名为folder模块,即如果使用import folder则可以调用在__init__.py文件文件中定义的变量。
将__init__.py文件编写如下
from folder.abcd import b c = 3
在myModule文件夹下打开命令行,进入python交互模式
>>> import folder >>> folder.c 3 >>> folder.b 2 >>> from folder import b >>> b 2
对比之前的from folder.abcd import b,使用__init__.py文件可以将常用的一些变量导入以方便调用。
另外需要注意两点
- __ init__ .py文件编写时,如果要导入其他模块中的变量,即使__ init__.py文件和abcd.py文件在同一个文件夹下,也不能from abcd import b,要从abcd文件从哪里来开始写,即从包的名称开始,from folder.abcd import b。
- folder文件夹里的嵌套文件夹内不需要新建__init__.py文件即可像模块一样调用,但是一般还是要新建这个文件,可以方便地导入常用变量。
用import hello时,python会搜寻hello.py文件,搜索顺序如下
先搜寻内置模块是否有hello(因此我们定义的模块名不能内置模块相同)
若内置模块没有,则看以下这些目录里有没有>>> import sys >>> sys.path ['', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/Users/xws/Library/Python/2.7/lib/python/site-packages']
其中第一个’‘表示当前的工作路径,我们可以看出安装的第三方包所在路径(‘/Users/xws/Library/Python/2.7/lib/python/site-packages’)也在这个列表之中,所以无论工作路径在哪里,都能搜寻到这些包。建议把模块放在该文件夹下。
__ all __
import *的方式无法导入以下划线开头的变量名_e = 4
__ init__.py文件内容更改如下
from folder.abcd import b c = 3 _e = 4
python模式下,以下导入方式,在查找变量_e是会报name ‘_e’ is not defined
>>> from folder import * >>> c 3 >>> _e Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name '_e' is not defined
但如果指定导入_e便可以
>>> from folder import c >>> c 3 >>> from folder import _e >>> _e 4
如果定义了__all__,则import *就可以导入下划线开头的变量
__ init__.py文件内容更改如下
from folder.abcd import b __all__ = ['c', '_e'] c = b + 1 _e = 4
>>> from folder import * >>> b Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'b' is not defined >>> c 3 >>> _e 4
由上面的输出结果,我们可以知道import *只会导入__all__中指定的变量,无论是否以下划线开头。这样限制可以防止import *命令导入太多变量污染命名空间,过滤掉一些中间变量如b
五、模块导入的绝对引用与相对引用
python中的import分为绝对引用和相对引用两种。它们之间的差异在于,引用模块时,定位被引用模块位置 的方式不同。
绝对引用是通过.的连接,指定出最高级文件(夹),到目标文件的绝对路径。我们上面的所有用法都属于绝对引用。
而相对引用是指定待引用模块与当前文件的相对位置,.表示上一级文件
- 绝对引用:from folder.abcd import myclass
- 相对引用:from .abcd import myclass
在实际使用中,无论是绝对导入还是相对导入都要注意,如何导入与被调用位置有关。
以下面的文件结构为例
folder1
│ first1.py
│ first2.py
│ init.py
│
└─folder2
second1.py
second2.py
init.py下面分为两种情况
-
folder1是一个项目。运行这个项目需要在folder文件夹中打开cmd,运行python first1.py
此时first1.py文件中引用first2.py中变量只需from first2 import sth
不可以from folder1.first2 import sth,也不可以 from .first2 import sth
(即使folder1中有定义_init_.py,在文件夹内部打开cmd仍无法搜索到folder1的名称)
first1.py文件中引用second1.py中变量需要from folder2.second1 import sth
second1.py文件中引用second2.py中变量需要from folder2.second2 import sth
或者使用相对引用方法:from .second2 import sth
(注意first1引用first2 与 second1引用second2 的区别) -
folder1是一个包。一般使用时,是在外面的文件夹中import这个包
此时first1.py文件中引用first2.py中变量需要from folder1.first2 import sth
或者from .first2 import sth
不可以 from first2 import sth,即使两个first文件在同一个文件夹内
从上面两个例子的对比中我们可以看出,一个项目内的文件之间,相互引用变量时,如何import是要看这个项目是在什么文件中调用的,也可以说要看这些文件和调用处之间的相对位置。
import运行本质
使用import语句,要明确两件事
(1)执行导入模块命令时,会首先检查待导入的模块是否在当前已有模块之中,如果有则跳过import。因此模块之间相互引用不会导致无限循环。
查看当前已导入模块使用下面方法
import sys sys.modules
得到结果是一个字典,键是模块名,值是文件所在路径
(2)import语句与文件执行
在这样的文件结构下
myModule
| first.py
|───folder
| | abcd.py
| | __ init __.pyfolder是一个package,abcd是一个module
import folder只是导入package,相当于执行__ init__ .py文件
from folder import abcd则执行了__ init __ .py文件文件与abcd.py文件
from folder.abcd import b其实也执行了 __ init __ . py 文件文件与abcd.py文件
(要知道执行了什么,可以在这些文件之中添加print语句,看是否打印出结果)知道这个执行原理,可以更好理解前面得到的一些结论
首先是在__init__.py文件中什么都没有的情况下,import folder无法调用abcd模块中的变量,是因为相当与运行了一个空文件,没有将整个包导入工作空间
abcd模块中定义了print语句后,import两次,只有第一次会print出值,说明第二次检查出模块已在导入之列,忽略了这条import命令六、if __ name__ == '__ main__'有什么作用
我们经常会在代码中看到这一句 if __ name__ == ‘__ main__’ ,为了理解它的作用,我们来看下面的例子
在folder文件夹下新建new.py文件,里面内容为
print(__name__)
在folder文件夹下打开命令行,输入
python new.py
返回结果
xws@MHQ0063 folder % python new.py __main__
在myModule文件夹下打开命令行,进入python交互模式
>>> from folder import new folder.new >>> print(__name__) __main__ >>> print(new.__name__) folder.new
从测试结果可以发现直接运行文件和import文件是有差异的,差异在于二者的__ name__ 变量不同。__ name__ 变量是一个特殊的变量,每个py文件运行时都会对应一个 __ name__变量,即使在交互模式下也可以查看这个变量值。所以 if __ name__ == '__ main__'的作用就很好理解了,即import时不执行下面的代码,只有在直接执行这个文件时才运行之后的代码。这算是一种约定俗成的写法,如果不怕文件被import,可以不用这个。
七、os模块
import os 是导入标准库os
os(operation system)import os
os(Operation System)操作系统有了OS模块,我们不需要关心什么操作系统下使用什么模块,OS模块会帮你选择正确的模块并调用
-
threadAndPackage:线和包书
2021-07-02 19:08:10threadAndPackage threadAndPackage book 《node.js实战》第7,8,9章手稿 -
projectz:不要再浪费时间维护项目的自述文件和包文件了! 让Projectz为您做
2021-04-29 05:22:34不要再浪费时间同步和更新项目的自述文件和包文件了! 到目前为止,projectz已被和直接使用,并且被2936个存储库和349个软件包间接使用。 观看谈话。 这是它可以做的一些事情: 使您的项目数据文件适当同步,... -
多姿多彩的袋和包.doc
2021-09-15 23:16:22多姿多彩的袋和包.doc -
SlidingMenu库和包
2014-06-17 00:10:12SlidingMenu库和包SlidingMenu库和包 -
ORACLE包和包体的创建和使用
2013-07-31 10:11:52ORACLE 包和包体的创建和使用,深入浅出。