基础知识 标签

Python列表片语法有趣

  |   0 评论   |   0 浏览   |   给我丶鼓励
# Python的列表片语法可以在没有索引的情况下用于一些有趣而有用的事情

# 你可以清除列表中的所有元素:
>>> lst = [1, 2, 3, 4, 5]
>>> del lst[:]
>>> lst
[]

# 您可以替换列表的所有元素,而不需要创建一个新的列表对象:
>>> a = lst
>>> lst[:] = [7, 8, 9]
>>> lst
[7, 8, 9]
>>> a
[7, 8, 9]
>>> a is lst
True

# 您还可以创建列表的(浅)副本:
>>> b = lst[:]
>>> b
[7, 8, 9]
>>> b is lst
False

探讨字节码的幕后

  |   0 评论   |   0 浏览   |   给我丶鼓励
# 您可以使用Python内置的“dis”模块来反汇编函数并检查它们的CPython VM字节码

>>> def greet(name):
...     return 'Hello, ' + name + '!'

>>> greet('Dan')
'Hello, Dan!'

>>> import dis
>>> dis.dis(greet)
2   0 LOAD_CONST     1 ('Hello, ')
    2 LOAD_FAST      0 (name)
    4 BINARY_ADD
    6 LOAD_CONST     2 ('!')
    8 BINARY_ADD
   10 RETURN_VALUE

避免与虚拟环境的版本冲突

  |   0 评论   |   0 浏览   |   给我丶鼓励
# 虚拟环境("virtualenvs")将项目依赖关系分离开来。
# 它们可以帮助您避免包和Python运行时的不同版本之间的版本冲突。

# 在创建和激活virtualenv之前:“python”和“pip”映射
# 到python解释器的系统版本( Python 2.7)
$ which python
/usr/local/bin/python

# 让我们使用另一个版本的Python创建一个新的virtualenv(Python 3)
$ python3 -m venv ./venv

# virtualenv只是一个“文件夹中的Python环境”
$ ls ./venv
bin      include    lib      pyvenv.cfg

# 激活virtualenv可以配置当前shell会话,
# 以使用来自virtualenv文件夹的python(和pip)命令,而不是全局环境
$ source ./venv/bin/activate

# 请注意,激活一个virtualenv是如何修改shell提示符的,
# 提示中显示了virtualenv文件夹的名称
(venv) $ echo "wee!"

# 使用active virtualenv,“python”命令映射到active virtualenv
# 内部的解释器二进制
(venv) $ which python
/Users/dan/my-project/venv/bin/python3

# 使用“pip”安装新的库和框架,现在就会将它们安装到virtualenv沙箱
# 中,这样全局环境(以及其他virtualenvs)就不会被修改
(venv) $ pip install requests

# 要回到全局Python环境,请运行以下命令
(venv) $ deactivate

# 看看提示符是如何再次变为“正常”的
$ echo "yay!"

# 停用virtualenv将“python”和“pip”命令翻转回全局环境
$ which python
/usr/local/bin/python

for循环(和while循环)可以有一个else分支?

  |   0 评论   |   0 浏览   |   给我丶鼓励
# Python的' for '和' while '循环支持' else '子句,
# 该子句仅在循环结束而没有碰到' break '语句时执行。
def contains(haystack, needle):
    """
    Throw a ValueError if `needle` not
    in `haystack`.
    """
    for item in haystack:
        if item == needle:
            break
    else:
        # 这里的“else”是一个“completion子句”,
        # 它只在循环运行到补全而没有碰到“break”语句时运行。
        raise ValueError('Needle not found')


>>> contains([23, 'needle', 0xbadc0ffee], 'needle')
None

>>> contains([23, 42, 0xbadc0ffee], 'needle')
ValueError: "Needle not found"


# 就个人而言,我不喜欢循环中的“else”“completion子句”,
# 因为我觉得它很混乱。我宁愿做这样的事
def better_contains(haystack, needle):
    for item in haystack:
        if item == needle:
            return
    raise ValueError('Needle not found')

# 注意:通常您会编写类似这样的内容来进行成员资格测试,
# 这更符合python的风格
if needle not in haystack:
    raise ValueError('Needle not found')

or循环(和while循环)可以有一个else分支?

  |   0 评论   |   0 浏览   |   给我丶鼓励
# Python的' for '和' while '循环支持' else '子句,该子句仅在循环结束而没有碰到' break '语句时执行。
def contains(haystack, needle):
    """
    Throw a ValueError if `needle` not
    in `haystack`.
    """
    for item in haystack:
        if item == needle:
            break
    else:
        # 这里的“else”是一个“completion子句”,
        # 它只在循环运行到完成时没有碰到“break”语句时运行
        raise ValueError('Needle not found')


>>> contains([23, 'needle', 0xbadc0ffee], 'needle')
None

>>> contains([23, 42, 0xbadc0ffee], 'needle')
ValueError: "Needle not found"

# 就个人而言,我不喜欢循环中的“else”“completion子句”,
# 因为我觉得它很混乱。我宁愿做这样的事
def better_contains(haystack, needle):
    for item in haystack:
        if item == needle:
            return
    raise ValueError('Needle not found')

# 注意:通常您会编写类似这样的内容来进行成员资格测试,
# 这更符合python的风格
if needle not in haystack:
    raise ValueError('Needle not found')

检查列表中的所有元素是否相等

  |   0 评论   |   0 浏览   |   给我丶鼓励
# 检查列表中所有项是否相等的python方法

>>> lst = ['a', 'a', 'a']

>>> len(set(lst)) == 1
True

>>> all(x == lst[0] for x in lst)
True

>>> lst.count(lst[0]) == len(lst)
True

# 我从“最python化”到“最python化”,从“最低效”到“最高效”。
# len(set())解决方案是惯用的,但是构造一个集合在内存和速度方面效率较低。

contextlib.suppress

  |   0 评论   |   0 浏览   |   给我丶鼓励
# 在Python 3.4+中,可以使用context .suppress()选择性地忽略特定异常

import contextlib

with contextlib.suppress(FileNotFoundError):
    os.remove('somefile.tmp')

# 这相当于:

try:
    os.remove('somefile.tmp')
except FileNotFoundError:
    pass

# contextlib.suppress docstring: 
#
# "返回一个上下文管理器,如果在with语句的主体中出现任何指定的异常,该上下文管理器
# 将抑制这些异常,然后在with语句结束后继续执行第一个语句。

在Python 3.x中强制只使用关键字的参数

  |   0 评论   |   0 浏览   |   给我丶鼓励

# 在Python3中,你可以使用一个“*”的星号。在函数参数列表中强制执行调用者使用关键字参数的某些参数:
>>> def f(a, b, *, c='x', d='y', e='z'):
...     return 'Hello'

# 为了传递c、d和e的值,您需要显式地将其作为“key=value”命名的参数传递
>>> f(1, 2, 'p', 'q', 'v')

TypeError: 
"f() takes 2 positional arguments but 5 were given"

>>> f(1, 2, c='p', d='q',e='v')
'Hello'

谈谈 Vue 中的 v-model 与 sync

  |   0 评论   |   0 浏览   |   Erioifpud

说实话,这个修饰符我用得很少,不是因为他没有用,实际上他和 v-model 的功能基本上(为什么是基本,下文有解释)是一样的,但是 v-model 在一个组件上只能出现一次,试想一下,如果你需要双向绑定多个变量怎么办?最基础的写法如下: