python 基础2

python 基础2

一些python基础知识,以防忘记。

以下除了代码部分,大部分都来自与python官方文档,有许多删减,少许是与C++的比对。

逻辑值检测

任何对象都可以进行逻辑值的检测。一个对象在默认情况下均被视为真值,除非当该对象被调用时其所属类定义了 __bool__() 方法且返回 False 或是定义了 __len__() 方法且返回零。 1下面基本完整地列出了会被视为假值的内置对象:

  • 被定义为假值的常量: NoneFalse
  • 任何数值类型的零: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
  • 空的序列和多项集: '', (), [], {}, set(), range(0)

示例

class A:
    #定义基本属性(没有下划线表示public类型)
    a = 0
    #定义私有属性(双下划线前缀表示private,单下划线表示protected)__b = 0#定义构造方
    def __init__(self,x,y):
        self.a = x
        self.__b = y
    
    def __bool__(self):
        return self.a>0

a = A(-1,5)
if a:
    print(1)
else:
    print(-1)
#输出-1,这里如若去__bool__方法,会输出1。__len__方法类似

布尔运算符

且或非对应于:and,or,not。C++:&&,||,!

OperationResult
x or yif x is false, then y, else x
x and yif x is false, then x, else y
not xif x is false, then True, else False

比较运算符

运算含义
<严格小于
<=小于或等于
>严格大于
>=大于或等于
==等于
!=不等于
is对象标识
is not否定的对象标识

它们的优先级相同(比布尔运算的优先级高)。

==与is

除不同的数字类型外,不同类型的对象不能进行相等比较。具有不同标识的类的实例比较结果通常为不相等,除非类定义了 __eq__() 方法。

这里的__eq__()方法类似于C++中的操作符重载(operator ==),如若设置正确,不同类型的对象也能进行相等比较。其他的符号重载也有类似的函数。

运算符 isis not 用于检测对象的标识号:当且仅当 xy 是同一对象时 x is y 为真。 一个对象的标识号可使用 id() 函数来确定。 x is not y 会产生相反的逻辑值

示例:

class A:
    #定义基本属性(没有下划线表示public类型)
    a = 0
    #定义私有属性(双下划线前缀表示private,单下划线表示protected)
    __b = 0
    #定义构造方法
    def __init__(self,x,y):
        self.a = x
        self.__b = y
    
    def __bool__(self):
        return self.a>0

    def __eq__(self,obj):
        return self.a == obj.a
#未定义__eq__()方法
class B:
    a = 0
    def __init__(self,x):
        self.a = x
class C:
    a = 0
    def __init__(self,x):
        self.a = x

a = A(-1,5)
if a:
    print(1)
else:
    print(-1)

a1 = a5 =  A(1,6)
a2 = A(1,6)
a3 = A(2,6)
b1 = B(1)
c1 = C(1)

#同类对象实例的比较,要看__eq__()的定义
print(a1==a2)
print(a1==a3)

#比较标识,这个标识可由id()获得
print(a1 is a5)
print(id(a1))
print(id(a5))

#会调用a1中的方法
print(b1==a1)

#未定义的__eq__()的两个类,==比较得到false
print(b1==c1)

#输出:
'''
True
False
True
1523027327576
1523027327576
True
False
'''

数字类型

存在三种不同的数字类型: 整数, 浮点数复数。 此外,布尔值属于整数的子类型。 整数具有无限的精度。 浮点数通常使用 C 中的 double 来实现;有关你的程序运行所在机器上浮点数的精度和内部表示法可在 sys.float_info 中查看。 复数包含实部和虚部,分别以一个浮点数表示。 要从一个复数 z 中提取这两个部分,可使用 z.realz.imag

迭代器类型

Python 支持在容器中进行迭代的概念。 这是通过使用两个单独方法来实现的;它们被用于允许用户自定义类对迭代的支持

容器对象要提供迭代支持,必须定义一个方法:container.__iter__()。这个方法返回一个迭代器对象。该对象需要支持迭代器协议。 如果容器支持不同的迭代类型,则可以提供额外的方法来专门地请求不同迭代类型的迭代器。

迭代器对象自身需要支持以下两个方法,它们共同组成了 迭代器协议:

  1. iterator.__iter__(),返回迭代器对象本身。

  2. iterator.__next__(),从容器中返回下一项。

类似于C++的迭代器,迭代器就是访问容器接扣。通过迭代器,顺序访问容器的元素。

序列类型

有三种基本序列类型:list, tuple 和 range 对象。

通用序列操作

运算结果
x in s如果 s 中的某项等于 x 则结果为 True,否则为 False
x not in s如果 s 中的某项等于 x 则结果为 False,否则为 True
s + tst 相拼接
s * nn * s相当于 s 与自身进行 n 次拼接
s[i]s 的第 i 项,起始为 0
s[i:j]sij 的切片
s[i:j:k]sij 步长为 k 的切片
len(s)s 的长度
min(s)s 的最小项
max(s)s 的最大项
s.index(x[, i[, j]])xs 中首次出现项的索引号(索引号在 i 或其后且在 j 之前)
s.count(x)xs 中出现的总次数
列表

通常用于存放同类项目的集合(其中精确的相似程度将根据应用而变化)。

可以用多种方式构建列表:

  • 使用一对方括号来表示空列表: []
  • 使用方括号,其中的项以逗号分隔: [a], [a, b, c]
  • 使用列表推导式: [x for x in iterable]
  • 使用类型的构造器: list()list(iterable)

iterable 可以是序列、支持迭代的容器或其它可迭代对象。

示例:

#空元组
a = []
b = [1,2,3]
#利用列表推导
c = [x for x in range(0,6)]
#利用类型的构造器
d = list()
print(a)
print(b)
print(c)
print(d)
#输出
'''
[]
[1, 2, 3]
[0, 1, 2, 3, 4, 5]
[]
'''

元组

通常用于储存异构数据的多项集

可以用多种方式构建元组:

  • 使用一对圆括号来表示空元组: ()
  • 使用一个后缀的逗号来表示单元组: a,(a,)
  • 使用以逗号分隔的多个项: a, b, c or (a, b, c)
  • 使用内置的 tuple(): tuple()tuple(iterable)

其构造方法与列表类似。

range对象

range 类型表示不可变的数字序列,通常用于在 for 循环中循环指定的次数。

class range(stop)

class range(start, stop[, step])

这是它的两个构造器。

range 构造器的参数必须为整数(可以是内置的 int 或任何实现了 __index__ 特殊方法的对象)。 如果省略 step 参数,其默认值为 1。 如果省略 start 参数,其默认值为 0,如果 step 为零则会引发 ValueError

如果 step 为正值,确定 range r 内容的公式为 r[i] = start + step*i 其中 i >= 0r[i] < stop

如果 step 为负值,确定 range 内容的公式仍然为 r[i] = start + step*i,但限制条件改为 i >= 0r[i] > stop.

与C++类似,表示的左闭右开区间。即元素在[start,stop)之间。

# range对象
a = list(range(0,10,2))
b = list(range(11))
print(a) 
print(b) 
#输出
'''
[0, 2, 4, 6, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
'''

文本序列类型-str

在 Python 中处理文本数据是使用 str 对象,也称为 字符串。 字符串是由 Unicode 码位构成的不可变 序列。 字符串字面值有多种不同的写法:

  • 单引号: '允许包含有 "双" 引号'
  • 双引号: "允许包含有 '单' 引号"
  • 三重引号: '''三重单引号''', """三重双引号"""

使用三重引号的字符串可以跨越多行 —— 其中所有的空白字符都将包含在该字符串字面值中。

字符串的方法

略,比C++的丰富的多。

集合类型

包含set,frozenset。 常见的用途包括成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。作为一种无序的多项集,集合并不记录元素位置或插入顺序。 相应地,集合不支持索引、切片或其他序列类的操作。

set 类型是可变的 — 其内容可以使用 add()remove() 这样的方法来改变。 由于是可变类型,它没有哈希值,且不能被用作字典的键或其他集合的元素。 frozenset 类型是不可变并且为 hashable — 其内容在被创建后不能再改变;因此它可以被用作字典的键或其他集合的元素。

构造方式

class set([iterable])

class frozenset([iterable])

示例:

#set 
a = set([1,1,2,2,4,5,6,7])
print(a)
#输出:
'''
{1, 2, 4, 5, 6, 7}
'''

映射类型

dict–字典(一对一映射)

mapping 对象会将 hashable 值映射到任意对象。 映射属于可变对象。字典的键 几乎 可以是任何值。 非 hashable 的值,即包含列表、字典或其他可变类型的值(此类对象基于值而非对象标识进行比较)不可用作键。数字类型用作键时遵循数字比较的一般规则:如果两个数值相等 (例如 11.0) 则两者可以被用来索引同一字典条目。 (但是请注意,由于计算机对于浮点数存储的只是近似值,因此将其用作字典键是不明智的。)

字典可以通过将以逗号分隔的 键: 值 对列表包含于花括号之内来创建,例如: {'jack': 4098, 'sjoerd': 4127}{4098: 'jack', 4127: 'sjoerd'},也可以通过 dict 构造器来创建。

  • class dict(**kwarg)
  • class dict(mapping, **kwarg)
  • class dict(iterable, **kwarg)

所支持的操作:略。详见python参考文档。

# 在前的为键(key),在后的为映射值
# 此处的例子是'a','b'为键,1,2映射值
a = {'a':1,'b':2}
# 会以用花括号构造的方式打印字典
print(a)
#返回所有键值
print(list(a))
print(a['b'])

# 其他构造方式
a = dict(one=1, two=2, three=3)
c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
d = dict([('two', 2), ('one', 1), ('three', 3)])
e = dict({'three': 3, 'one': 1, 'two': 2})
print(a)
print(c)
print(d)
print(e)

'''输出
{'a': 1, 'b': 2}
['a', 'b'] 
2
{'one': 1, 'two': 2, 'three': 3}
{'one': 1, 'two': 2, 'three': 3}
{'two': 2, 'one': 1, 'three': 3}
{'three': 3, 'one': 1, 'two': 2}
'''

reference

  1. https://docs.python.org/zh-cn/3/library/stdtypes.html#built-in-types
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值