曹耘豪的博客

Python入门

  1. Python安装
  2. 生成器
    1. 列表生成式
    2. 字典生成式
    3. 生成器
  3. 定制Python的类
    1. def __iter__(self)
    2. def __next__(self)
    3. def __contains__(self, item)
    4. def __bool__(self)
  • 使用decimal计算金额
  • 相关问题
    1. py文件路径存在空格
    2. json.loads报错
  • Python安装

    2024-04-29

    安装包下载: https://mirrors.huaweicloud.com/python

    生成器

    列表生成式

    1
    2
    3
    4
    5
    6
    # [0, 1, 2, 3, 4]
    list1 = [i for i in range(0, 5)]
    # [0, 1, 4, 9, 16]
    list2 = [i*i for i in range(0, 5)]
    # [0, 1, 4]
    list2 = [i*i for i in range(0, 5) if i < 3]

    字典生成式

    1
    2
    # {'a', 1}
    dict 1 = {k, v for k, v in {'a': 1}.items()}

    生成器

    1
    2
    3
    4
    5
    6
    # <generator object <genexpr> at 0x103acb2b0>
    gen1 = (i for i in range(0, 5))

    # 需要注意,生成器只能遍历一遍
    list(gen1) # [0, 1, 2, 3, 4]
    list(gen1) # []

    定制Python的类

    2018-04-08

    假设类++实例++为my_class,即my_class = MyClass()

    def __iter__(self)

    itor()调用,返回类的迭代器版本用于迭代, 通常使用于for语句等

    def __next__(self)

    获取下一个元素

    在作为迭代器时的iterable接口,若无则会报错

    TypeError: 'xx' object is not iterable

    在与for语句联合使用时,同时要实现def __iter__(self)以返回迭代器

    1
    2
    for item in my_class:
    # do something
    def __contains__(self, item)

    返回TrueFalse: 是否存在item

    使用方法

    1
    2
    if item in my_class:
    # do something
    def __bool__(self)

    返回返回实体类的布尔属性TrueFalse

    1
    2
    3
    4
    if my_class:
    print('True')
    else:
    print('False')

    使用decimal计算金额

    2024-11-17
    在线运行: https://www.online-python.com/

    float不精准

    1
    2
    3
    4
    5
    6
    >>> int(float('34.61') * 100)
    3461
    >>> int(float('34.62') * 100)
    3461
    >>> float('34.62') * 100
    3461.9999999999995

    使用decimal

    1
    2
    3
    >>> import decimal
    >>> int(decimal.Decimal('34.62') * 100)
    3462

    相关问题

    py文件路径存在空格

    2018-12-11

    当文件或文件夹存在空格时,python xxx/xxx.py命令找不到对应的文件

    1
    2
    3
    4
    5
    6
    7
    path=/Users/root/script/python\ script/demo.py
    python $path
    # 找不到文件

    # 相当于
    python /Users/root/script/python script/demo.py
    # 将/Users/root/script/python当作了文件,把script/demo.py当作了第二个参数

    解决方案

    使用 python "xxx.py"

    1
    2
    3
    4
    path='/Users/root/script/python script/demo.py'
    python "$path"
    # 相当于
    python "/Users/root/script/python script/demo.py"

    json.loads报错

    2022-10-12

    这个json应该是控制台打印出来的或者浏览器显示的的,所以如果value有"引号时,输出时会添加转义符。如:

    1
    {"key":"\"value\""}

    上述json复制到网站格式化是正常的,但如果直接粘贴到代码里就会有报错

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> import json
    >>> json.loads('{"key":"\"value\""}')
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "/usr/local/Cellar/python@3.9/3.9.12/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
    File "/usr/local/Cellar/python@3.9/3.9.12/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "/usr/local/Cellar/python@3.9/3.9.12/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
    json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 10 (char 9)

    是因为此时的\是转义符,相当于输入了{"key":""value""},自然是个不合法json。我们需要的是json里的转义符而不是python字符串的转义符,所以再添加一个\,如下:

    1
    2
    3
    >>> import json
    >>> json.loads('{"key":"\\"value\\""}')
    {'key': '"value"'}

    这样就可以了。但如果json很大,手动逐个添加\并不现实,字符串替换也不方便,我们可以在字符串前加r,使用原始字符串文本

    1
    2
    3
    >>> import json
    >>> json.loads(r'{"key":"\"value\""}')
    {'key': '"value"'}

    也可以先把源json写到文件里,再读,因为文件里的\就不再是转义符了

    1
    2
    3
    4
    5
    6
    7
    8
    >>> import json
    >>> with open('data.txt') as f:
    ... json.load(f)
    ...
    {'key': '"value"'}

    ➜ cat data.txt
    {"key":"\"value\""}

    参考:

       /