Python基础入门:从变量到异常处理

@[TOCPython基础入门:从变量到异常处理本次学习了变量、运算符及数据类型,位运算,条件语句,循环语句及异常处理。对位运算印象深刻,如利用位运算实现整数集合¶一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)。比如集合 {1, 3, 4, 8},可以表示成 01 00 01 10 10 而对应的位运算也就可以看作是对集合进行的操作。元素与集合的操作:a | (1<<i) -> 把 i 插入到集合中a & ~(1<<i) -
摘要由CSDN通过智能技术生成

@[TOCPython基础入门:从变量到异常处理
本次学习了变量、运算符及数据类型,位运算,条件语句,循环语句及异常处理。
对位运算印象深刻,如利用位运算实现整数集合¶
一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)。

比如集合 {1, 3, 4, 8},可以表示成 01 00 01 10 10 而对应的位运算也就可以看作是对集合进行的操作。

元素与集合的操作:

a | (1<<i) -> 把 i 插入到集合中
a & ~(1<<i) -> 把 i 从集合中删除
a & (1<<i) -> 判断 i 是否属于该集合(零不属于,非零属于)
集合之间的操作:

a 补 -> ~a
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a & (~b)
注意:整数在内存中是以补码的形式存在的,输出自然也是按照补码输出。

【例子】C#语言输出负数。

class Program
{
static void Main(string[] args)
{
string s1 = Convert.ToString(-3, 2);
Console.WriteLine(s1);
// 11111111111111111111111111111101

    string s2 = Convert.ToString(-3, 16);
    Console.WriteLine(s2); 
    // fffffffd
}

}
【例子】 Python 的bin() 输出。

print(bin(3)) # 0b11
print(bin(-3)) # -0b11

print(bin(-3 & 0xffffffff))

0b11111111111111111111111111111101


print(bin(0xfffffffd))

0b11111111111111111111111111111101


print(0xfffffffd) # 4294967293
0b11
-0b11
0b11111111111111111111111111111101
0b11111111111111111111111111111101
4294967293
是不是很颠覆认知,我们从结果可以看出:

Python中bin一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号,巨坑。
Python中的整型是补码形式存储的。
Python中整型是不限制长度的不会超范围溢出。
所以为了获得负数(十进制表示)的补码,需要手动将其和十六进制数0xffffffff进行按位与操作,再交给bin()进行输出,得到的才是负数的补码表示。

在使用变量之前,需要对其先赋值。
变量名可以包括字母、数字、下划线、但变量名不能以数字开头。
Python 变量名是大小写敏感的,foo != Foo。
【例子】

teacher = “老马的程序人生”
print(teacher) # 老马的程序人生
老马的程序人生
【例子】

first = 2
second = 3
third = first + second
print(third) # 5
5
【例子】

myTeacher = “老马的程序人生”
yourTeacher = “小马的程序人生”
ourTeacher = myTeacher + ‘,’ + yourTeacher
print(ourTeacher) # 老马的程序人生,小马的程序人生
老马的程序人生,小马的程序人生
4. 数据类型与转换
类型 名称 示例
int 整型 <class ‘int’> -876, 10
float 浮点型<class ‘float’> 3.149, 11.11
bool 布尔型<class ‘bool’> True, False
整型

【例子】通过 print() 可看出 a 的值,以及类 (class) 是int。

a = 1031
print(a, type(a))

1031 <class ‘int’>

1031 <class ‘int’>
Python 里面万物皆对象(object),整型也不例外,只要是对象,就有相应的属性 (attributes) 和方法(methods)。

【例子】

b = dir(int)
print(b)

[‘abs’, ‘add’, ‘and’, ‘bool’, ‘ceil’, ‘class’,

delattr’, ‘dir’, ‘divmod’, ‘doc’, ‘eq’,

float’, ‘floor’, ‘floordiv’, ‘format’, ‘ge’,

getattribute’, ‘getnewargs’, ‘gt’, ‘hash’,

index’, ‘init’, ‘init_subclass’, ‘int’, ‘invert’,

le’, ‘lshift’, ‘lt’, ‘mod’, ‘mul’, ‘ne’,

neg’, ‘new’, ‘or’, ‘pos’, ‘pow’, ‘radd’,

rand’, ‘rdivmod’, ‘reduce’, ‘reduce_ex’, ‘repr’,

rfloordiv’, ‘rlshift’, ‘rmod’, ‘rmul’, ‘ror’,

round’, ‘rpow’, ‘rrshift’, ‘rshift’, ‘rsub’,

rtruediv’, ‘rxor’, ‘setattr’, ‘sizeof’, ‘str’,

sub’, ‘subclasshook’, ‘truediv’, ‘trunc’, ‘xor’,

‘bit_length’, ‘conjugate’, ‘denominator’, ‘from_bytes’, ‘imag’,

‘numerator’, ‘real’, ‘to_bytes’]

[‘abs’, ‘add’, ‘and’, ‘bool’, ‘ceil’, ‘class’, ‘delattr’, ‘dir’, ‘divmod’, ‘doc’, ‘eq’, ‘float’, ‘floor’, ‘floordiv’, ‘format’, ‘ge’, ‘getattribute’, ‘getnewargs’, ‘gt’, ‘hash’, ‘index’, ‘init’, ‘init_subclass’, ‘int’, ‘invert’, ‘le’, ‘lshift’, ‘lt’, ‘mod’, ‘mul’, ‘ne’, ‘neg’, ‘new’, ‘or’, ‘pos’, ‘pow’, ‘radd’, ‘rand’, ‘rdivmod’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘rfloordiv’, ‘rlshift’, ‘rmod’, ‘rmul’, ‘ror’, ‘round’, ‘rpow’, ‘rrshift’, ‘rshift’, ‘rsub’, ‘rtruediv’, ‘rxor’, ‘setattr’, ‘sizeof’, ‘str’, ‘sub’, ‘subclasshook’, ‘truediv’, ‘trunc’, ‘xor’, ‘bit_length’, ‘conjugate’, ‘denominator’, ‘from_bytes’, ‘imag’, ‘numerator’, ‘real’, ‘to_bytes’]
对它们有个大概印象就可以了,具体怎么用,需要哪些参数 (argument),还需要查文档。看个bit_length()的例子。

【例子】找到一个整数的二进制表示,再返回其长度。

a = 1031
print(bin(a)) # 0b10000000111
print(a.bit_length()) # 11
0b10000000111
11
浮点型

【例子】

print(1, type(1))

1 <class ‘int’>


print(1., type(1.))

1.0 <class ‘float’>


a = 0.00000023
b = 2.3e-7
print(a) # 2.3e-07
print(b) # 2.3e-07
1 <class ‘int’>
1.0 <class ‘float’>
2.3e-07
2.3e-07
有时候我们想保留浮点型的小数点后 n 位。可以用 decimal 包里的 Decimal 对象和 getcontext() 方法来实现。

import decimal
from decimal import Decimal
Python 里面有很多用途广泛的包 (package),用什么你就引进 (import) 什么。包也是对象,也可以用上面提到的dir(decimal) 来看其属性和方法。

【例子】getcontext() 显示了 Decimal 对象的默认精度值是 28 位 (prec=28)。

a = decimal.getcontext()
print(a)

Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,

capitals=1, clamp=0, flags=[],

traps=[InvalidOperation, DivisionByZero, Overflow])

Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
b = Decimal(1) / Decimal(3)
print(b)

0.3333333333333333333333333333

0.3333333333333333333333333333
【例子】使 1/3 保留 4 位,用 getcontext().prec 来调整精度。

decimal.getcontext().prec = 4
c = Decimal(1) / Decimal(3)
print©

0.3333

0.3333
布尔型

布尔 (boolean) 型变量只能取两个值,True 和 False。当把布尔型变量用在数字运算中,用 1 和 0 代表 True 和 False。

【例子】

print(True + True) # 2
print(True + False) # 1
print(True * False) # 0
2
1
0
除了直接给变量赋值 True 和 False,还可以用 bool(X) 来创建变量,其中 X 可以是

基本类型:整型、浮点型、布尔型
容器类型:字符串、元组、列表、字典和集合
【例子】bool 作用在基本类型变量:X 只要不是整型 0、浮点型 0.0,bool(X) 就是 True,其余就是 False。

print(type(0), bool(0), bool(1))

<class ‘int’> False True


print(type(10.31), bool(0.00), bool(10.31))

<class ‘float’> False True


print(type(True), bool(False), bool(True))

<class ‘bool’> False True

<class ‘int’> False True
<class ‘float’> False True
<class ‘bool’> False True
【例子】bool 作用在容器类型变量:X 只要不是空的变量,bool(X) 就是 True,其余就是 False。

print(type(’’), bool(’’), bool(‘python’))

<class ‘str’> False True


print(type(()), bool(()), bool((10,)))

<class ‘tuple’> False True


print(type([]), bool([]), bool([1, 2]))

<class ‘list’> False True


print(type({}), bool({}), bool({‘a’: 1, ‘b’: 2}))

<class ‘dict’> False True


print(type(set()), bool(set()), bool({1, 2}))

<class ‘set’> False True

<class ‘str’> False True
<class ‘tuple’> False True
<class ‘list’> False True
<class ‘dict’> False True
<class ‘set’> False True
确定bool(X) 的值是 True 还是 False,就看 X 是不是空,空的话就是 False,不空的话就是 True。

对于数值变量,0, 0.0 都可认为是空的。
对于容器变量,里面没元素就是空的。
获取类型信息

获取类型信息 type(object)
【例子】

print(isinstance(1, int)) # True
print(isinstance(5.2, float)) # True
print(isinstance(True, bool)) # True
print(isinstance(‘5.2’, str)) # True
True
True
True
True
注:

type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
Python 标准异常总结
BaseException:所有异常的 基类
Exception:常规异常的 基类
StandardError:所有的内建标准异常的基类
ArithmeticError:所有数值计算异常的基类
FloatingPointError:浮点计算异常
OverflowError:数值运算超出最大限制
ZeroDivisionError:除数为零
AssertionError:断言语句(assert)失败
AttributeError:尝试访问未知的对象属性
EOFError:没有内建输入,到达EOF标记
EnvironmentError:操作系统异常的基类
IOError:输入/输出操作失败
OSError:操作系统产生的异常(例如打开一个不存在的文件)
WindowsError:系统调用失败
ImportError:导入模块失败的时候
KeyboardInterrupt:用户中断执行
LookupError:无效数据查询的基类
IndexError:索引超出序列的范围
KeyError:字典中查找一个不存在的关键字
MemoryError:内存溢出(可通过删除对象释放内存)
NameError:尝试访问一个不存在的变量
UnboundLocalError:访问未初始化的本地变量
ReferenceError:弱引用试图访问已经垃圾回收了的对象
RuntimeError:一般的运行时异常
NotImplementedError:尚未实现的方法
SyntaxError:语法错误导致的异常
IndentationError:缩进错误导致的异常
TabError:Tab和空格混用
SystemError:一般的解释器系统异常
TypeError:不同类型间的无效操作
ValueError:传入无效的参数
UnicodeError:Unicode相关的异常
UnicodeDecodeError:Unicode解码时的异常
UnicodeEncodeError:Unicode编码错误导致的异常
UnicodeTranslateError:Unicode转换错误导致的异常
异常体系内部有层次关系,Python异常体系中的部分关系如下所示:

Image

  1. Python标准警告总结
    Warning:警告的基类
    DeprecationWarning:关于被弃用的特征的警告
    FutureWarning:关于构造将来语义会有改变的警告
    UserWarning:用户代码生成的警告
    PendingDeprecationWarning:关于特性将会被废弃的警告
    RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
    SyntaxWarning:可疑语法的警告
    ImportWarning:用于在导入模块过程中触发的警告
    UnicodeWarning:与Unicode相关的警告
    BytesWarning:与字节或字节码相关的警告
    ResourceWarning:与资源使用相关的警告
  2. try - except 语句
    try:
    检测范围
    except Exception[as reason]:
    出现异常后的处理代码
    try 语句按照如下方式工作:

首先,执行try子句(在关键字try和关键字except之间的语句)
如果没有异常发生,忽略except子句,try子句执行后结束。
如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的名称相符,那么对应的except子句将被执行。最后执行try - except语句之后的代码。
如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。
【例子】

try:
f = open(‘test.txt’)
print(f.read())
f.close()
except OSError:
print(‘打开文件出错’)

打开文件出错

打开文件出错
【例子】

try:
f = open(‘test.txt’)
print(f.read())
f.close()
except OSError as error:
print(‘打开文件出错\n原因是:’ + str(error))

打开文件出错

原因是:[Errno 2] No such file or directory: ‘test.txt’

打开文件出错
原因是:[Errno 2] No such file or directory: ‘test.txt’
一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。

【例子】

try:
int(“abc”)
s = 1 + ‘1’
f = open(‘test.txt’)
print(f.read())
f.close()
except OSError as error:
print(‘打开文件出错\n原因是:’ + str(error))
except TypeError as error:
print(‘类型出错\n原因是:’ + str(error))
except ValueError as error:
print(‘数值出错\n原因是:’ + str(error))

数值出错

原因是:invalid literal for int() with base 10: ‘abc’

数值出错
原因是:invalid literal for int() with base 10: ‘abc’
【例子】

dict1 = {‘a’: 1, ‘b’: 2, ‘v’: 22}
try:
x = dict1[‘y’]
except LookupError:
print(‘查询错误’)
except KeyError:
print(‘键错误’)
else:
print(x)

查询错误

查询错误
try-except-else语句尝试查询不在dict中的键值对,从而引发了异常。这一异常准确地说应属于KeyError,但由于KeyError是LookupError的子类,且将LookupError置于KeyError之前,因此程序优先执行该excep

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值