运维管理59 分钟阅读
一篇文章让你彻底掌握 Python
大家好,这里是公众号 DBA学习之路,分享一些学习数据库路上的知识和经验。 @TOC目录 bash ██████╗ ██╗ ██╗████████╗██╗ ██╗ ██████╗ ███╗ ██╗ ██╔══█
2024年8月14日
database
DBA 实战课程
系统学习 Oracle DBA
- 2738+ 篇实战文章
- 1500+ 步骤截图
- 10 大核心模块
开通会员 ¥128/月起
查看完整课程在知识库中专注阅读,并随时返回相关工具与课程
大家好,这里是公众号 DBA学习之路,分享一些学习数据库路上的知识和经验。

本章目标:掌握本章核心知识点 前置要求:完成前序章节学习 预计时长:60 分钟
1██████╗ ██╗ ██╗████████╗██╗ ██╗ ██████╗ ███╗ ██╗2██╔══██╗╚██╗ ██╔╝╚══██╔══╝██║ ██║██╔═══██╗████╗ ██║3██████╔╝ ╚████╔╝ ██║ ███████║██║ ██║██╔██╗ ██║4██╔═══╝ ╚██╔╝ ██║ ██╔══██║██║ ██║██║╚██╗██║5██║ ██║ ██║ ██║ ██║╚██████╔╝██║ ╚████║6╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝Linux/Unix 的系统上,Python 解释器通常被安装在 /usr/local/bin/python3.4 这样的有效路径(目录)里。
我们可以将路径 /usr/local/bin 添加到您的 Linux/Unix 操作系统的环境变量中,这样您就可以通过 shell 终端输入下面的命令来启动 Python。
在 Linux/Unix 系统中,你可以在脚本顶部添加以下命令让 Python 脚本可以像 SHELL 脚本一样可直接执行:
1#! /usr/bin/env python3.4Python 中的注释有三种形式:
# 开头''' 开始,以 ''' 结尾""" 开始,以 """ 结尾1# 单行注释23'''4这是多行注释,用三个单引号5这是多行注释,用三个单引号6这是多行注释,用三个单引号7'''89"""10这是多行注释,用三个双引号11这是多行注释,用三个双引号12这是多行注释,用三个双引号13"""Python3 中有六个标准的数据类型:
Python 语言支持以下类型的运算符:
1if condition_1:2 statement_block_13elif condition_2:4 statement_block_25else:6 statement_block_31while 判断条件:2 statements1for <variable> in <sequence>:2 <statements>1for i in range(0, 10, 3) :2 print(i)pass 语句什么都不做,它只在语法上需要一条语句但程序不需要任何操作时使用。例如:
1while True:2 pass # 等待键盘中断 (Ctrl+C)Python 定义函数使用 def 关键字,一般格式如下:
1def 函数名(参数列表):2 函数体1#!/usr/bin/env python32a = 4 # 全局变量34def print_func1():5 a = 17 # 局部变量6 print("in print_func a = ", a)7def print_func2():8 print("in print_func a = ", a)9print_func1()10print_func2()11print("a = ", a)以上实例运行结果如下:
1in print_func a = 172in print_func a = 43a = 4函数也可以使用 kwarg=value 的关键字参数形式被调用。例如,以下函数:
1def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):2 print("-- This parrot wouldn't", action, end=' ')3 print("if you put", voltage, "volts through it.")4 print("-- Lovely plumage, the", type)5 print("-- It's", state, "!")可以以下几种方式被调用:
1parrot(1000) # 1 positional argument2parrot(voltage=1000) # 1 keyword argument3parrot(voltage=1000000, action='VOOOOOM') # 2 keyword arguments4parrot(action='VOOOOOM', voltage=1000000) # 2 keyword arguments5parrot('a million', 'bereft of life', 'jump') # 3 positional arguments6parrot('a thousand', state='pushing up the daisies') # 1 positional, 1 keyword以下为错误调用方法:
1parrot() # required argument missing2parrot(voltage=5.0, 'dead') # non-keyword argument after a keyword argument3parrot(110, voltage=220) # duplicate value for the same argument4parrot(actor='John Cleese') # unknown keyword argument最后,一个最不常用的选择是可以让函数调用可变个数的参数。这些参数被包装进一个元组(查看元组和序列)。在这些可变个数的参数之前,可以有零到多个普通的参数:
1def arithmetic_mean(*args):2 sum = 03 for x in args:4 sum += x5 return sumPython 的函数的返回值使用 return 语句,可以将函数作为一个值赋值给指定变量:
1def return_sum(x,y):2 c = x + y3 return ctry 语句按照如下方式工作;
1import sys23try:4 f = open('myfile.txt')5 s = f.readline()6 i = int(s.strip())7except OSError as err:8 print("OS error: {0}".format(err))9except ValueError:10 print("Could not convert data to an integer.")11except:12 print("Unexpected error:", sys.exc_info()[0])13 raise14finally:15 # 清理行为Python 使用 raise 语句抛出一个指定的异常。例如:
1> raise NameError('HiThere')2Traceback (most recent call last):3 File "<stdin>", line 1, in ?4NameError: HiThere可以通过创建一个新的 exception 类来拥有自己的异常。异常应该继承自 Exception 类,或者直接继承,或者间接继承。
当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类:
1class Error(Exception):2 """Base class for exceptions in this module."""3 pass45class InputError(Error):6 """Exception raised for errors in the input.78 Attributes:9 expression -- input expression in which the error occurred10 message -- explanation of the error11 """1213 def __init__(self, expression, message):14 self.expression = expression15 self.message = message1617class TransitionError(Error):18 """Raised when an operation attempts a state transition that's not19 allowed.2021 Attributes:22 previous -- state at beginning of transition23 next -- attempted new state24 message -- explanation of why the specific transition is not allowed25 """2627 def __init__(self, previous, next, message):28 self.previous = previous29 self.next = next30 self.message = message大多数的异常的名字都以 ”Error” 结尾,就跟标准的异常命名一样。
语法格式如下:
1class ClassName:2 <statement-1>3 .4 .5 .6 <statement-N>类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。
类对象支持两种操作:属性引用和实例化。
属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name。
类对象创建后,类命名空间中所有的命名都是有效属性名。所以如果类定义是这样:
1#!/usr/bin/python323class MyClass:4 """一个简单的类实例"""5 i = 123456 def f(self):7 return 'hello world'89# 实例化类10x = MyClass()1112# 访问类的属性和方法13print("MyClass 类的属性 i 为:", x.i)14print("MyClass 类的方法 f 输出为:", x.f())实例化类:
1# 实例化类2x = MyClass()3# 访问类的属性和方法以上创建了一个新的类实例并将该对象赋给局部变量 x,x 为空的对象。
执行以上程序输出结果为:
MyClass 类的属性 i 为: 12345 MyClass 类的方法 f 输出为: hello world
很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为 init() 的特殊方法(构造方法),像下面这样:
1def __init__(self):2 self.data = []类定义了 init() 方法的话,类的实例化操作会自动调用 init() 方法。所以在下例中,可以这样创建一个新的实例:
1x = MyClass()当然, init() 方法可以有参数,参数通过 init() 传递到类的实例化操作上。例如:
1> class Complex:2... def __init__(self, realpart, imagpart):3... self.r = realpart4... self.i = imagpart5...6> x = Complex(3.0, -4.5)7> x.r, x.i8(3.0, -4.5)在类地内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数:
1#!/usr/bin/python323#类定义4class people:5 #定义基本属性6 name = ''7 age = 08 #定义私有属性,私有属性在类外部无法直接进行访问9 __weight = 010 #定义构造方法11 def __init__(self,n,a,w):12 self.name = n13 self.age = a14 self.__weight = w15 def speak(self):16 print("%s 说: 我 %d 岁。" %(self.name,self.age))1718# 实例化类19p = people('W3Cschool',10,30)20p.speak()执行以上程序输出结果为:
W3Cschool 说: 我 10 岁。
Python 同样支持类的继承,如果一种语言不支持继承就,类就没有什么意义。派生类的定义如下所示:
1class DerivedClassName(BaseClassName1):2 <statement-1>3 .4 .5 .6 <statement-N>需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python 从左至右搜索 即方法在子类中未找到时,从左到右查找基类中是否包含方法。
BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:
1class DerivedClassName(modname.BaseClassName):实例
1#!/usr/bin/python323#类定义4class people:5 #定义基本属性6 name = ''7 age = 08 #定义私有属性,私有属性在类外部无法直接进行访问9 __weight = 010 #定义构造方法11 def __init__(self,n,a,w):12 self.name = n13 self.age = a14 self.__weight = w15 def speak(self):16 print("%s 说: 我 %d 岁。" %(self.name,self.age))1718#单继承示例19class student(people):20 grade = ''21 def __init__(self,n,a,w,g):22 #调用父类的构函23 people.__init__(self,n,a,w)24 self.grade = g25 #覆写父类的方法26 def speak(self):27 print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))28293031s = student('ken',10,60,3)32s.speak()执行以上程序输出结果为:
ken 说: 我 10 岁了,我在读 3 年级
Python 同样有限的支持多继承形式。多继承的类定义形如下例:
1class DerivedClassName(Base1, Base2, Base3):2 <statement-1>3 .4 .5 .6 <statement-N>需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python 从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
1#!/usr/bin/python323#类定义4class people:5 #定义基本属性6 name = ''7 age = 08 #定义私有属性,私有属性在类外部无法直接进行访问9 __weight = 010 #定义构造方法11 def __init__(self,n,a,w):12 self.name = n13 self.age = a14 self.__weight = w15 def speak(self):16 print("%s 说: 我 %d 岁。" %(self.name,self.age))1718#单继承示例19class student(people):20 grade = ''21 def __init__(self,n,a,w,g):22 #调用父类的构函23 people.__init__(self,n,a,w)24 self.grade = g25 #覆写父类的方法26 def speak(self):27 print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))2829#另一个类,多重继承之前的准备30class speaker():31 topic = ''32 name = ''33 def __init__(self,n,t):34 self.name = n35 self.topic = t36 def speak(self):37 print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))3839#多重继承40class sample(speaker,student):41 a =''42 def __init__(self,n,a,w,g,t):43 student.__init__(self,n,a,w,g)44 speaker.__init__(self,n,t)4546test = sample("Tim",25,80,4,"Python")47test.speak() #方法名同,默认调用的是在括号中排前地父类的方法执行以上程序输出结果为:
我叫 Tim,我是一个演说家,我演讲的主题是 Python
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,实例如下:
1#!/usr/bin/python323class Parent: # 定义父类4 def myMethod(self):5 print ('调用父类方法')67class Child(Parent): # 定义子类8 def myMethod(self):9 print ('调用子类方法')1011c = Child() # 子类实例12c.myMethod() # 子类调用重写方法执行以上程序输出结果为:
调用子类方法
__private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时self.__private_attrs。
在类地内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 slef.__private_methods。
实例如下:
1#!/usr/bin/python323class JustCounter:4 __secretCount = 0 # 私有变量5 publicCount = 0 # 公开变量67 def count(self):8 self.__secretCount += 19 self.publicCount += 110 print (self.__secretCount)1112counter = JustCounter()13counter.count()14counter.count()15print (counter.publicCount)16print (counter.__secretCount) # 报错,实例不能访问私有变量执行以上程序输出结果为:
1122324Traceback (most recent call last):5 File "test.py", line 16, in <module>6 print (counter.__secretCount) # 报错,实例不能访问私有变量7AttributeError: 'JustCounter' object has no attribute '__secretCount'Python 同样支持运算符重载,我么可以对类的专有方法进行重载,实例如下:
1#!/usr/bin/python323class Vector:4 def __init__(self, a, b):5 self.a = a6 self.b = b78 def __str__(self):9 return 'Vector (%d, %d)' % (self.a, self.b)1011 def __add__(self,other):12 return Vector(self.a + other.a, self.b + other.b)1314v1 = Vector(2,10)15v2 = Vector(5,-2)16print (v1 + v2)以上代码执行结果如下所示:
1Vector(7,8)os 模块提供了不少与操作系统相关联的函数。
1> import os2> os.getcwd() # 返回当前的工作目录3'C:\\Python34'4> os.chdir('/server/accesslogs') # 修改当前的工作目录5> os.system('mkdir today') # 执行系统命令 mkdir60glob 模块提供了一个函数用于从目录通配符搜索中生成文件列表:
1> import glob2> glob.glob('*.py')3['primes.py', 'random.py', 'quote.py']通用工具脚本经常调用命令行参数。这些命令行参数以链表形式存储于 sys 模块的 argv 变量。例如在命令行中执行 python demo.py one two three 后可以得到以下输出结果:
1> import sys2> print(sys.argv)3['demo.py', 'one', 'two', 'three']sys 还有 stdin,stdout 和 stderr 属性,即使在 stdout 被重定向时,后者也可以用于显示警告和错误信息。
1> sys.stderr.write('Warning, log file not found starting a new one\n')2Warning, log file not found starting a new onere 模块为高级字符串处理提供了正则表达式工具。对于复杂的匹配和处理,正则表达式提供了简洁、优化的解决方案:
1> import re2> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')3['foot', 'fell', 'fastest']4> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')5'cat in the hat'math 模块为浮点运算提供了对底层 C 函数库的访问:
1> import math2> math.cos(math.pi / 4)30.707106781186547574> math.log(1024, 2)510.0一篇文章让你彻底掌握 Shell 🔥
Oracle 一键巡检自动生成 Word 报告 🔥
Oracle一键安装脚本的 21 个疑问与解答 🔥
Oracle一键巡检脚本的 21 个疑问与解答 🔥
全网首发:Oracle 23ai 一键安装脚本 🔥
Oracle 19C 最新 RU 补丁 19.24 ,一键安装! 🔥
Oracle Linux 6 一键安装 Oracle 11GR2 RAC
Oracle Linux 7.9 一键安装 Oracle 19C
Oracle Linux 8.9 一键安装 Oracle 19C RAC
Oracle Linux 9.4(aarch64) 一键安装 Oracle 19C 🔥
openEuler 20.03 LTS SP4 一键安装 Oracle 19C 🔥
openEuler 22.03 LTS SP4 一键安装 Oracle 19C RAC
RHEL 7.9 一键安装 Oracle 19C 19.23 RAC
Redhat 8.4 一键安装 Oracle 11GR2
RedHat 9.4(aarch64) 一键安装 Oracle 19C
龙蜥 Anolis 7.9 一键安装 Oracle 19C 19.23
龙蜥 Anolis OS 8.8 一键安装 Oracle 19C
SUSE 15 SP5 一键安装 Oracle 19C
统信 UOS V20 1070(a) 一键安装 Oracle 11GR2
Ubuntu 22.04 一键安装 Oracle 19C
Ubuntu 14.04 一键安装 Oracle 19C
银河麒麟 Kylin V10 SP3 一键安装 Oracle 19C 🔥
银河麒麟 Kylin V10 SP3 一键安装 Oracle 11GR2 RAC
Oracle DataGuard GAP 修复手册 🔥
优化 Oracle:最佳实践与开发规范
DBA 必备:Linux 软件源配置全攻略 🔥
Linux 一键配置时钟同步全攻略 🔥
Starwind 配置 ISCSI 共享存储
SUSE 15 SP3 安装 Oracle 19C RAC 数据库
达梦 8 数据库安装手册 🔥
Oracle 12CR2 RAC 安装避坑宝典
Linux7 安装 Oracle 19C RAC 详细图文教程 🔥
Oracle ADG 搭建 RAC to Single 详细教程
Oracle DataGuard GAP 修复手册 🔥
Oracle 分区表之在线重定义
AutoUpgrade 快速升级 Oracle 数据库
Oracle 数据库巡检命令手册 🔥
Oracle 数据坏块的 N 种修复方式 🔥
数据库 SQL 开发入门教程
超全 Linux 基础命令总结 🔥
VMware 虚拟机安装 Linux 系统
Linux 安装 MySQL 详细教程
教你玩转 SQLPLUS,工作效率提升 200%
