Python,标准数据类型,函数,异常处理,面向对象编程及模块

一、Python标准的数据类型

Python3中有六个标准的数据类型:1、Number(数字),2、String(字符串),3、List(列表),4、Tuple(元组),5、Sets(集合),6、Dictionary(字典)。

1、Number(数字)

Python3 支持 int、float、bool、complex(复数)。

type()与isinstance()比较:1、isinstance()会认为子类是一种父类类型;2、type()不会认为子类是一种父类类型。

a,b,c,d=123,123.456,True,21j
#    
print(type(a),type(b),type(c),type(d))

a,b,c,d=123,123.456,True,21j
# True
print(isinstance(a, int))
# True
print(isinstance(b,float))
# True
print(isinstance(c,bool))
# True
print(isinstance(d,complex))
# True True True True
print(isinstance(a,int),isinstance(b,float),isinstance(c,bool),isinstance(d,complex))

class A:
  id=1
class B(A):
  id=1
# True
print(isinstance(A(),A))
# True
print(type(A())==A)
# True
print(isinstance(B(),A))
# False
print(type(B())==A)

2、String(字符串)

Python中的字符串用单引号(')或双引号(")括起来,同时使用反斜杠(\)转义特殊字符。

str = 'what21'
print(str)            # 输出字符串
print(str[0:-1])      # 输出第一个到倒数第二个的所有字符
print(str[0])         # 输出字符串第一个字符
print(str[2:5])       # 输出从第三个开始到第五个的字符
print(str[2:])        # 输出从第三个开始的后的所有字符
print(str * 2)        # 输出字符串两次
print(str + ".com")   # 连接字符串

str = 'what21	com'
print(str)

3、List(列表)

(1)、列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。

(2)、列表是写在方括号([])之间、用逗号分隔开的元素列表。

(3)、和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表。

list = ['123', 456 , 7.89, 'what21', "com"]
list2 =["www",'小奋斗']
# ['123', 456, 7.89, 'what21', 'com']
print(list)
# 123
print(list[0])
# ['123', 456, 7.89]
print(list[0:3])
# [456, 7.89, 'what21', 'com']
print(list[1:])
# ['123', 456, 7.89, 'what21', 'com', '123', 456, 7.89, 'what21', 'com']
print(list*2)       # 输出两次列表
# ['123', 456, 7.89, 'what21', 'com', 'www', '小奋斗']
print(list + list2)

4、Tuple(元组)

元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号(())里,元素之间用逗号隔开。

tuple = ('123', 456 , 7.89, 'what21', "com")
tuple2 =["www",'小奋斗']
# ('123', 456, 7.89, 'what21', 'com')
print(tuple)
# 123
print(tuple[0])
# ('123', 456, 7.89)
print(tuple[0:3])
# (456, 7.89, 'what21', 'com')
print(tuple[1:])
# ('123', 456, 7.89, 'what21', 'com', '123', 456, 7.89, 'what21', 'com')
print(tuple*2)       # 输出两次列表

5、Set(集合)

(1)、集合(set)是一个无序不重复元素的序列。

(2)、基本功能是进行成员关系测试和删除重复元素。

(3)、可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

person={"zhangsan","lisi","wangwu","zhaoliu"}
print(person);
if('zhangsan' in person):
  print("zhangsan在集合中")
else:
  print("zhangsan不在集合中")
a = set('what21')
b = set("com")
print(a)
print(b)
print(a-b)     # a和b的差集
print(a|b)     # a和b的并集
print(a&b)     # a和b的交集
print(a^b)     # a和b中不同时存在的元素

6、Dictionary(字典)

(1)、列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

(2)、字典是一种映射类型,字典用"{ }"标识,它是一个无序的键(key) : 值(value)对集合。

(3)、键(key)必须使用不可变类型。

(4)、在同一个字典中,键(key)必须是唯一的。

dict = {}
dict['one'] = "小奋斗"
dict[2]     = "www.what21.com"
dict2 = {'name': '小奋斗','code':1, 'site': 'www.what21.com'}
print (dict['one'])       # 输出键为 'one' 的值
print (dict[2])           # 输出键为 2 的值
print (dict2)             # 输出完整的字典
print (dict2.keys())      # 输出所有键
print (dict2.values())    # 输出所有值

7、迭代器

(1)、迭代器有两个基本的方法:iter() 和 next()。

(2)、字符串,列表或元组对象都可用于创建迭代器。

import sys
str = 'what21'
list = ['123', 456 , 7.89, 'what21', "com"]
tuple = ('123', 456 , 7.89, 'what21', "com")
person={"zhangsan","lisi","wangwu","zhaoliu"}
'''迭代1'''
it = iter(str)
for x in it:
    print (x, end=" | ")
print()
"""迭代2"""
it2=iter(tuple);
for a in it2:
  print(a,end=" , ");
print()
# 迭代3 #
itr = iter(list);
while True:
  try:
    print(next(itr), end=" | ")
  except StopIteration:
    sys.exit()

8、数据类型转换

(1)、int(x [,base]),将x转换为一个整数。

(2)、float(x),将x转换到一个浮点数。

(3)、complex(real [,imag]),创建一个复数。

(4)、str(x),将对象 x 转换为字符串。

(5)、repr(x),将对象 x 转换为表达式字符串。

(6)、eval(str),用来计算在字符串中的有效Python表达式,并返回一个对象。

(7)、tuple(s),将序列 s 转换为一个元组。

(8)、list(s),将序列 s 转换为一个列表。

(9)、set(s),转换为可变集合。

(10)、dict(d),创建一个字典。d 必须是一个序列 (key,value)元组。

(11)、frozenset(s),转换为不可变集合。

(12)、chr(x),将一个整数转换为一个字符。

(13)、ord(x),将一个字符转换为它的整数值。

(14)、hex(x),将一个整数转换为一个十六进制字符串。

(15)、oct(x),将一个整数转换为一个八进制字符串。

二、Python函数的定义和函数的应用

1、函数能提高应用的模块性,和代码的重复利用率。2、参数传递为,可更改(mutable)与不可更改(immutable)对象。3、闭包和装饰器。

1、函数的使用

(1)、global语句可以起到声明变量作用域。

(2)、函数的不可变类型:类似其他语言的值传递,数值、字符串和元组为不可变类型。

(3)、如fun(a),传递的只是a的值,没有影响a对象本身。比如在fun(a)内部修改a的值,只是修改另一个复制的对象,不会影响a本身。

'''函数'''
def hello():
  print("hello function!");
hello()

def p_num():
    global num
    print(num)
    num=50
num=20
p_num()
print(num)

def area(width, height):
  return width * height
def welcome(name):
  print("www.what21", name)
welcome(".com")
width = 40
height = 50
print("width =", width,",height =", height,",area =", area(width, height))

2、函数的不可变类型

(1)、函数的不可变类型:类似其他语言的值传递,数值、字符串和元组为不可变类型。

(2)、如fun(a),传递的只是a的值,没有影响a对象本身。比如在fun(a)内部修改a的值,只是修改另一个复制的对象,不会影响a本身。

def ChangeList(mylist):
  "修改传入的列表"
  mylist.append([1, 2, 3, 4])
  # 函数内取值:  [10, 20, 30, [1, 2, 3, 4]]
  print("函数内取值: ", mylist)
  return
# 调用changeme函数
mylist = [10, 20, 30]
ChangeList(mylist)
# 函数外取值:  [10, 20, 30, [1, 2, 3, 4]]
print("函数外取值: ", mylist)

3、函数的内部作用域

(1)、当内部作用域需要修改外部作用域的变量时,就要用到global和nonlocal关键字。

(2)、如果需要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要nonlocal关键字。

def outer():
  num = 10
  def inner():
    nonlocal num   # nonlocal关键字声明
    num = 100
    print(num)
  inner()
  print(num)
outer()

4、装饰器

(1)、装饰器的本质:一个闭包函数。

(2)、装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展。

def w1(func):
  def inner():
    print(" 验证1")
    print(" 验证3")
    print(" 验证4")
    return func()
  return inner
@w1
def f1():
  print( 'f1')
@w1
def f2():
  print('f2')
@w1
def f3():
  print('f3')
@w1
def f4():
  print('f4')
import time
def timer(func):
  def inner():
    start = time.time()
    func()
    end=time.time()
    print(end - start)
  return inner
print(time.time());
@timer   #==> func1 = timer(func1)
def func1():
  print('in func1')
func1()

三、Python面相对象编程

1、概念

(1)、类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法,对象是类的实例。

(2)、类变量:类变量在整个实例化的对象中是公用的,类变量定义在类中且在函数体之外,类变量通常不作为实例变量使用。

(3)、数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。

(4)、方法重载:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

(5)、实例变量:定义在方法中的变量,只作用于当前实例的类。

(6)、继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。

(7)、实例化:创建一个类的实例,类的具体对象。

(8)、方法:类中定义的函数。

(9)、对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

(10)、多继承:Python支持多继承。

2、案例1

class User:
  height=1.65
  weight=120
  def __init__(self,name,height,weight):
    self.name=name
    self.height=height
    self.weight=weight
  def info(self):
      print(self.__class__)
      print("姓名:",self.name,",身高:",self.height,",体重:" ,self.weight)
zhangsan = User("张三",1.65,120)
zhangsan.info()
lisi = User("李四",1.55,140)
lisi.info()
print(id(zhangsan), id(lisi))
print(zhangsan==lisi)
print(isinstance(zhangsan,User))
print(isinstance(lisi,User))
print(type(zhangsan)==User)
print(type(lisi)==User)

(1)、_init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法

(2)、self代表类的实例,self在定义类的方法时是必须有的。

3、案例2

class User:
  height=1.65
  weight=120
  def __init__(self,name,height,weight):
    self.name=name
    self.height=height
    self.weight=weight
  def info(self):
    print(self.__class__)
    print("姓名:",self.name,",身高:",self.height,",体重:" ,self.weight)
class Admin(User):
  def setName(self,name):
    User.name = name;
  def setHeight(self,height):
    User.height = height;
  def setWeight(self,weight):
    User.weight = weight;
  def info(self):
    print(self.__class__)
    print(User.__class__)
    print("姓名:", User.name, ",身高:", User.height, ",体重:", User.weight)
zhangsan = Admin("",0,0);
zhangsan.setName("张三")
zhangsan.setHeight(1.65)
zhangsan.setWeight(120)
zhangsan.info()
lisi = Admin("李四",1.55,140)
lisi.info()

(1)、实例d调用foo()时,搜索顺序是:D => C1 => C2 => P1。

(2)、实例d调用bar()时,搜索顺序是:D => C1 => C2。

(3)、可以看出,新式类的搜索方式是采用“广度优先”的方式去查找属性。

(4)、pass关键字,不做任何事情,一般用做占位语句。

(5)、其中:1、共有变量,直接字母开头;2、私有变量,使用__开头;3、@classmethod,装饰器函数。

四、Python异常处理和自定义异常

1、概念

Python提供了异常处理和断言(Assertions)功能来处理程序在运行中出现的异常和错误。

2、异常应用

try:
  fh = open("testfile", "w")
  fh.write("test except!!!")
except IOError:
  print ("Error: not found file or read file error")
else:
  print("内容写入文件成功")
  fh.close()
try:
  fh = open("testfile", "w")
  try:
    fh.write("test except!!!")
  finally:
    print("关闭文件")
    fh.close()
except IOError:
  print("Error: 没有找到文件或读取文件失败")

(1)、当在try块中抛出一个异常,立即执行finally块代码。

(2)、finally块中的所有语句执行后,异常被再次触发,并执行except块代码。

3、自定义异常

class MyError(Exception):
  def __init__(self, value):
    self.value = value

  def __str__(self):
    return repr(self.value)
try:
  raise MyError(2*2)
except MyError as e:
  print('抛出自定义异常, value:', e.value)

(1)、通过继承Exception类,来创建一个新的Exception类,可以直接继承或者间接继承。

(2)、raise指定了要被抛出的异常。

4、Python标准异常

BaseException->所有异常的基类

SystemExit->解释器请求退出

KeyboardInterrupt->用户中断执行(通常是输入^C)

Exception->常规错误的基类

StopIteration->迭代器没有更多的值

GeneratorExit->生成器(generator)发生异常来通知退出

StandardError->所有的内建标准异常的基类

ArithmeticError->所有数值计算错误的基类

FloatingPointError->浮点计算错误

OverflowError->数值运算超出最大限制

ZeroDivisionError->除(或取模)零 (所有数据类型)

AssertionError->断言语句失败

AttributeError->对象没有这个属性

EOFError->没有内建输入,到达EOF 标记

EnvironmentError->操作系统错误的基类

IOError->输入/输出操作失败

OSError->操作系统错误

WindowsError->系统调用失败

ImportError->导入模块/对象失败

LookupError->无效数据查询的基类

IndexError->序列中没有此索引(index)

KeyError->映射中没有这个键

MemoryError->内存溢出错误(对于Python 解释器不是致命的)

NameError->未声明/初始化对象 (没有属性)

UnboundLocalError->访问未初始化的本地变量

ReferenceError->弱引用(Weak reference)试图访问已经垃圾回收了的对象

RuntimeError->一般的运行时错误

NotImplementedError->尚未实现的方法

SyntaxError->Python 语法错误

IndentationError->缩进错误

TabError->Tab 和空格混用

SystemError->一般的解释器系统错误

TypeError->对类型无效的操作

ValueError->传入无效的参数

UnicodeError->Unicode 相关的错误

UnicodeDecodeError->Unicode 解码时的错误

UnicodeEncodeError->Unicode 编码时错误

UnicodeTranslateError->Unicode 转换时错误

Warning->警告的基类

DeprecationWarning->关于被弃用的特征的警告

FutureWarning->关于构造将来语义会有改变的警告

OverflowWarning->旧的关于自动提升为长整型(long)的警告

PendingDeprecationWarning->关于特性将会被废弃的警告

RuntimeWarning->可疑的运行时行为(runtime behavior)的警告

SyntaxWarning->可疑的语法的警告

UserWarning->用户代码生成的警告

五、模块和自定义模块

1、概念

(1)、Python模块(Module)是一个Python文件,以.py 结尾,包含了Python对象定义和Python语句。

(2)、模块能够有逻辑地组织Python代码段。

(3)、把相关的代码分配到一个模块里,让代码更好用,更易懂。

(4)、模块能定义函数,类和变量,模块里也能包含可执行的代码。

(5)、导入语法:模块名.函数名

(6)、语法:from math import *

2、案例

user.py

class User:
  height=1.65
  weight=120
  def __init__(self,name,height,weight):
    self.name=name
    self.height=height
    self.weight=weight
  def info(self):
    print(self.__class__)
    print("姓名:",self.name,",身高:",self.height,",体重:" ,self.weight)
class Admin(User):
  def setName(self,name):
    User.name = name;
  def setHeight(self,height):
    User.height = height;
  def setWeight(self,weight):
    User.weight = weight;
  def info(self):
    print(self.__class__)
    print(User.__class__)
    print("姓名:", User.name, ",身高:", User.height, ",体重:", User.weight)

main.py

import user
zhangsan = user.Admin("",0,0);
zhangsan.setName("张三")
zhangsan.setHeight(1.65)
zhangsan.setWeight(120)
zhangsan.info()
lisi = user.Admin("李四",1.55,140)
lisi.info()

当导入一个模块,Python解析器对模块位置的搜索顺序是:1、当前目录。2、如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。3、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章