享受每一天,Just Enjoy !

0%

1. 配置文件

在编写程序时,会用到一些配置。一般配置都会写入.ini的文件。如果要使用python读取配置,就可以使用python自带的configparser模块

本文首发于伊洛的个人博客:https://yiluotalk.com,欢迎关注并查看更多内容!!!

2. ini文件结构
  • 键值对可以使用' = '' : ' 分隔
  • section区分大小写
  • key的名字不区分大小写
  • 键值对中头部、尾部的空白符被去掉
  • 配置文件注释以 #或者;为开头
    3. 简单的使用
  • 手写一个段代码生成ini文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 伊洛Yiluo
    # https://yiluotalk.com
    import configparser
    config = configparser.ConfigParser()
    config['DEFAULT'] = {
    'ServerAliveInterval': '45',
    'Compression': 'yes',
    'CompressionLevel': '9'
    }
    config['bitbucket.org'] = {}
    config['bitbucket.org']['User'] = 'hg'
    config['topsectet.server.com'] = {}
    topsecret = config['topsectet.server.com']
    topsecret['Port'] = '50022'
    topsecret['ForwardX11'] = 'no'
    config['DEFAULT']['ForwardX11'] = 'yes'
    with open('example.ini', 'w') as configfile:
    config.write(configfile)
  • 查看生成的ini文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [DEFAULT]
    serveraliveinterval = 45
    compression = yes
    compressionlevel = 9
    forwardx11 = yes

    [bitbucket.org]
    user = hg

    [topsectet.server.com]
    port = 50022
    forwardx11 = no
    4. 读取配置文件
  • 现在读取配置文件
    1
    2
    3
    4
    >>> import configparser
    >>> config = configparser.ConfigParser()
    >>> config.sections()
    []
  • 由于没有读配置文件example.ini ,所以sections为空,现在读取下配置文件再查看下结果
    1
    2
    3
    4
    >>> config.read('example.ini')
    ['example.ini']
    >>> config.sections()
    ['bitbucket.org', 'topsectet.server.com']
  • 看到可以正常的读取到配置,再来单独的读取一条配置
    1
    2
    >>> config['bitbucket.org']['user']
    'hg'
  • 读取多条配置
    1
    2
    3
    4
    5
    6
    7
    >>> for i in config['DEFAULT']:
    ... print(i)
    ...
    serveraliveinterval
    compression
    compressionlevel
    forwardx11
    5. 一般使用
    通常来讲一般公司都会有几套环境:开发环境、测试环境、灰度环境、生产环境
    在做接口自动化时就需要针对不同的环境跑对应的用例或是测试集,不同环境的配置就可以写入ini的配置文件方便后续调用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    # 伊洛Yiluo
    # https://yiluotalk.com
    [test_env]
    # 测试服配置
    tester = 伊洛yiluo
    environment = test
    host =
    login_name =
    login_password =


    [grey_env]
    # 灰度服配置
    tester = 伊洛yiluo
    environment = grey
    host =
    login_name =
    login_password =


    [release_env]
    # 正式配置
    tester = 伊洛yiluo
    environment = release
    host =
    login_name =
    login_password =


    [mail]
    # 邮件报告配置
    smtpserver =
    sender =
    receiver =
    username =
    password =


    [dingding]
    # dinging报告配置
    robot_url =
    messageUrl =
    待续……
    在这里插入图片描述

    关注公众号获取更多内容

    欢迎下方【戳一下】【点赞】
    Author:伊洛Yiluo
    愿你享受每一天,Just Enjoy !

一. 日志的作用
  • 日志是对软件执行时所发生事件的一种追踪方式,无论是开发人员还是测试人员,日志的重要的作用应该是不言而喻的;不但可以帮助开发定位缺陷解决问题,也可以辅助在测试过程中的测试工程师定位缺陷。
    作为测试人员更应该重视日志,无论是单元测试去捕获Traceback,还是做接口/UI自动化都应当输出有必要的日志

    本文首发自伊洛的个人博客:https://yiluotalk.com,欢迎关注并查看更多内容!!!

  • 那么python中,怎么可以做到一个算是标准的日志记录呢? 很多人会使用print直接输出的方式,但是其实这事极为不规范的做法,来看看官网上怎么说
    截图来自官网
  • 今天就来简单的介绍下python logging模块的基本使用方法
    二. 日志的级别
  • 5个级别分别是,可以注意到源码中,WARN = WARNING,后续使用中两者是一个意思
    截图来自官网
  • 每个级别都有对应的一个值
三. logging的工作流程
  • 还是先来看看官网上的流程图
    截图来自官网
  • 可以看到以下几种类型,Logger、LogRecord、Filter、Handler、Formatter
  1. Logger:是进行日志记录时创建的对象
  2. LogRecord:日志记录器,将日志传到相应的处理器处理
  3. Handler:即用来处理日志记录的类
  4. Filter :过滤器
  5. Formatter:格式化器, 指明了最终输出中日志记录的布局
    四. 简单的例子
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 伊洛Yiluo
    # https://yiluotalk.com
    import logging

    logging.debug('调试信息')
    logging.info('信息消息')
    logging.warning('错误:config file %s not found', 'server.conf')
    logging.error('发生错误')
    logging.critical('关键错误')
  • 看以下输出结果
    1
    2
    3
    4
    5
    WARNING:root:错误:config file server.conf not found
    ERROR:root:发生错误
    CRITICAL:root:关键错误

    Process finished with exit code 0
    五. basicConfig() 使用方法
  • basicConfig()主要做一些基础的配置
  • 我们将日志的结果输出到一个名为"test.log"的文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 伊洛Yiluo
    # https://yiluotalk.com
    import logging

    logging.basicConfig(filename="test.log", filemode="w", level=logging.DEBUG)
    logging.debug('This is a debug message')
    logging.info('This is an info message')
    logging.warning('This is a warning message')
    logging.error('This is an error message')
    logging.critical('This is a critical message')
  • 打开"test.log"文件
    1
    2
    3
    4
    5
    DEBUG:root:This is a debug message
    INFO:root:This is an info message
    WARNING:root:This is a warning message
    ERROR:root:This is an error message
    CRITICAL:root:This is a critical message
  • filename:即日志输出的文件名
  • filemode:这个是指定日志文件的写入方式
  • format:指定日志信息的输出格式
  • datefmt:指定时间的输出格式
  • level:指定日志输出的类别
    六. 自定义 Logger
  • 定义一个Logger,名字为test_log, 通常默认为 __name__
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 伊洛Yiluo
    # https://yiluotalk.com
    import logging

    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    logger = logging.getLogger('test_log')

    logger.info('info log1')
    logger.debug('debug log')
    logger.warning('warning log')
    logger.info('info log2')
    logger.info('info log3')
    logger.critical('critical log')
  • 查看文件的日志结果
    1
    2
    3
    4
    5
    2020-02-13 09:49:51,040 - test_log - INFO - info log1
    2020-02-13 09:49:51,040 - test_log - WARNING - warning log
    2020-02-13 09:49:51,040 - test_log - INFO - info log2
    2020-02-13 09:49:51,040 - test_log - INFO - info log3
    2020-02-13 09:49:51,040 - test_log - CRITICAL - critical log
七. 设置等级
  • 设置等级为WARNING,打印出包括这个等级及这个等级之上级别的日志
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 伊洛Yiluo
    # https://yiluotalk.com
    import logging

    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    logger = logging.getLogger('test_log')
    logger.setLevel(level=logging.WARNING)

    logger.info('info log1')
    logger.debug('debug log')
    logger.warning('warning log')
    logger.info('info log2')
    logger.info('info log3')
    logger.critical('critical log')
  • 如下按照等级打印出了日志的信息
    1
    2
    3
    4
    2020-02-13 10:04:57,325 - test_log - WARNING - warning log
    2020-02-13 10:04:57,325 - test_log - CRITICAL - critical log

    Process finished with exit code 0
    八. Handler 的使用
  • 重新记录一个日志的文件名为'test_log.log'
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 伊洛Yiluo
    # https://yiluotalk.com
    import logging

    logger = logging.getLogger('test_log')
    logger.setLevel(level=logging.DEBUG)
    handler = logging.FileHandler('test_log.log')
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)

    logger.info('info log1')
    logger.debug('debug log')
    logger.warning('warning log')
    logger.info('info log2')
    logger.info('info log3')
    logger.critical('critical log')
  • 查看日志文件的结果为
    1
    2
    3
    4
    5
    6
    2020-02-13 10:44:55,888 - test_log - INFO - info log1
    2020-02-13 10:44:55,888 - test_log - DEBUG - debug log
    2020-02-13 10:44:55,889 - test_log - WARNING - warning log
    2020-02-13 10:44:55,889 - test_log - INFO - info log2
    2020-02-13 10:44:55,889 - test_log - INFO - info log3
    2020-02-13 10:44:55,889 - test_log - CRITICAL - critical log
    九. 多个handler
  • 一个handler输出到控制台,一个handler输出到日志文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    # 伊洛Yiluo
    # https://yiluotalk.com
    import logging
    import sys

    logger = logging.getLogger('test_log')
    logger.setLevel(level=logging.INFO)

    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    # 输出到控制台的handler
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setLevel(level=logging.INFO)
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)

    # 输出到文件的handler
    file_handler = logging.FileHandler('test_log.log')
    file_handler.setLevel(level=logging.DEBUG)
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)


    logger.info('info log1')
    logger.debug('debug log')
    logger.warning('warning log')
    logger.info('info log2')
    logger.info('info log3')
    logger.critical('critical log')
  • 输出都控制台
    1
    2
    3
    4
    5
    2020-02-13 11:05:49,000 - test_log - INFO - info log1
    2020-02-13 11:05:49,001 - test_log - WARNING - warning log
    2020-02-13 11:05:49,001 - test_log - INFO - info log2
    2020-02-13 11:05:49,001 - test_log - INFO - info log3
    2020-02-13 11:05:49,001 - test_log - CRITICAL - critical log
  • 输出到日志
    1
    2
    3
    4
    5
    2020-02-13 11:06:54,721 - test_log - INFO - info log1
    2020-02-13 11:06:54,722 - test_log - WARNING - warning log
    2020-02-13 11:06:54,722 - test_log - INFO - info log2
    2020-02-13 11:06:54,722 - test_log - INFO - info log3
    2020-02-13 11:06:54,722 - test_log - CRITICAL - critical log
待续文件配置,配置共享等……

在这里插入图片描述

欢迎下方【戳一下】【点赞】
Author:伊洛Yiluo
愿你享受每一天,Just Enjoy !

关注公众号获取更多内容

之前有介绍过python自带的Unittest单元测试框架,Python 自动化测试实战 Zero to Hero 单元测试框架unittest的使用,今天再来简单的讲诉下测试框架pytest

本文首发自伊洛的个人博客:https://yiluotalk.com,欢迎关注并查看更多内容!!!
#####1. 安装开始

  • 直接使用pip安装就可以,pytest支持python2.03.0版本
    1
    2
    3
    4
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    pip install -U pytest
  • 检查版本,校验下是否安装成功
    1
    2
    3
    4
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    (yiluo) ➜ ~ pytest --version
    2. pytest的基础语法规范
  • 文件名应必须以test开头或结尾,例如test_example.pyexample_test.py
  • 如果将测试定义为类上的方法,类名应以“ Test”开头。例如,TestExample。且不包含__init__方法
  • 测试方法名称或函数名称应以test_开头,例如test_example,名称与该模式不匹配的方法将不会作为测试执行
  • 按照命名的约定举个例子
    1
    2
    3
    4
    5
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    - demo_tests/
    - test_example.py
    3. 开始测试
  • 例子1
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    def func(x):
    return x + 1


    def test_answer():
    assert func(3) == 5
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    (yiluo) ➜ pytest pytest
    ======================== test session starts =========================
    platform darwin -- Python 3.7.5, pytest-5.3.2, py-1.8.0, pluggy-0.13.1
    plugins: allure-pytest-2.8.6, rerunfailures-5.0
    collected 1 item

    test_sample.py F [100%]

    ============================== FAILURES ==============================
    ____________________________ test_answer _____________________________

    def test_answer():
    > assert func(3) == 5
    E assert 4 == 5
    E + where 4 = func(3)

    test_sample.py:6: AssertionError
    ========================= 1 failed in 0.05s ==========================
  • 例子2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    import pytest


    def sum(num1, num2):
    return num1 + num2


    def test_sum():
    assert sum(3, 7) == 10
  • 运行查看结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ================================== test session starts ==================================
    platform darwin -- Python 3.7.5, pytest-5.3.2, py-1.8.0, pluggy-0.13.1

    plugins: allure-pytest-2.8.6, rerunfailures-5.0
    collected 1 item

    test_example.py . [100%]

    =================================== 1 passed in 0.01s ===================================
    1
    test_example.py .
  • 注意test_example.py .后面有一个点.,一个点就代表执行了一条测试用例
    执行多项测试
  • 如果需要获取更多信息的话,后面加上-v
    1
    2
    3
    4
    5
    collected 1 item                                                                        

    test_example.py::test_sum PASSED [100%]

    =================================== 1 passed in 0.01s ===================================
  • 再加一条用例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    import pytest


    def sum(num1, num2):
    return num1 + num2


    def test_sum():
    assert sum(3, 7) == 10


    def test_sum_output_type():
    assert type(sum(1, 2)) is int
  • 运行一下看下结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    collected 2 items

    test_example.py::test_sum PASSED [ 50%]
    test_example.py::test_sum_output_type PASSED [100%]

    =================================== 2 passed in 0.01s ===================================
  • 再试下用例执行不成功
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    import pytest


    def sum(num1, num2):
    return num1 + num2


    def test_sum():
    assert sum(3, 7) == 100


    def test_sum_output_type():
    assert type(sum(1, 2)) is int
  • 运行查看结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    test_example.py::test_sum FAILED                                                  [ 50%]
    test_example.py::test_sum_output_type PASSED [100%]

    ======================================= FAILURES ========================================
    _______________________________________ test_sum ________________________________________

    def test_sum():
    > assert sum(3, 7) == 100
    E assert 10 == 100
    E -10
    E +100

    test_example.py:12: AssertionError
    ============================== 1 failed, 1 passed in 0.06s ==============================
  • 例子3
  • 类的举例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    class TestClass(object):
    def test_one(self):
    x = 'Yiluo'
    assert 'l' in x

    def test_two(self):
    x = 'luoyi'
    assert hasattr(x, 'yiluo')
  • 运行结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    (yiluo) ➜  pytest pytest
    ======================== test session starts =========================
    platform darwin -- Python 3.7.5, pytest-5.3.2, py-1.8.0, pluggy-0.13.1
    plugins: allure-pytest-2.8.6, rerunfailures-5.0
    collected 2 items

    test_class.py .F [100%]

    ============================== FAILURES ==============================
    _________________________ TestClass.test_two _________________________

    self = <test_class.TestClass object at 0x10c5af7d0>

    def test_two(self):
    x = 'luoyi'
    > assert hasattr(x, 'yiluo')
    E AssertionError: assert False
    E + where False = hasattr('luoyi', 'yiluo')

    test_class.py:8: AssertionError
    ==================== 1 failed, 1 passed in 0.06s =====================
    1
    2
    3
    4
    5
    6
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    - 用法和调用命令行还可以是

    python -m pytest [...]
4. 参数化测试
  • 让我们对test_sum函数进行更改以使用参数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    import pytest


    def sum(num1, num2):
    return num1 + num2


    @pytest.mark.parametrize('num1 , num2, expected', [(3, 5, 8)])
    def test_sum(num1, num2, expected):
    assert sum(num1, num2) == expected


    def test_sum_output_type():
    assert type(sum(1, 2)) is int
  • 运行查看结果
    1
    2
    3
    4
    5
    6
    collected 2 items                                                                       

    test_example.py::test_sum[3-5-8] PASSED [ 50%]
    test_example.py::test_sum_output_type PASSED [100%]

    =================================== 2 passed in 0.04s ===================================
  • 多传几个参数试验一下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    import pytest


    def sum(num1, num2):
    return num1 + num2


    @pytest.mark.parametrize('num1 , num2, expected', [(3, 5, 8),
    (-2, -2, -4), (6, 6, 12), (6, -1, 5), (0, 5, 5)])
    def test_sum(num1, num2, expected):
    assert sum(num1, num2) == expected


    def test_sum_output_type():
    assert type(sum(1, 2)) is int
  • 运行查看结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    collected 6 items                                                                       

    test_example.py::test_sum[3-5-8] PASSED [ 16%]
    test_example.py::test_sum[-2--2--4] PASSED [ 33%]
    test_example.py::test_sum[6-6-12] PASSED [ 50%]
    test_example.py::test_sum[6--1-5] PASSED [ 66%]
    test_example.py::test_sum[0-5-5] PASSED [ 83%]
    test_example.py::test_sum_output_type PASSED [100%]

    =================================== 6 passed in 0.03s ===================================
  • 我们还可以进行函数调用以获取这些值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    import pytest


    def sum(num1, num2):
    return num1 + num2


    def get_sum_test_data():
    return [(3, 5, 8),
    (-2, -2, -4), (6, 6, 12), (6, -1, 5), (0, 5, 5)]


    @pytest.mark.parametrize('num1 , num2, expected', get_sum_test_data() )
    def test_sum(num1, num2, expected):
    assert sum(num1, num2) == expected


    def test_sum_output_type():
    assert type(sum(1, 2)) is int
  • 运行查看结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    collected 6 items                                                                       

    test_example.py::test_sum[3-5-8] PASSED [ 16%]
    test_example.py::test_sum[-2--2--4] PASSED [ 33%]
    test_example.py::test_sum[6-6-12] PASSED [ 50%]
    test_example.py::test_sum[6--1-5] PASSED [ 66%]
    test_example.py::test_sum[0-5-5] PASSED [ 83%]
    test_example.py::test_sum_output_type PASSED [100%]

    =================================== 6 passed in 0.02s ===================================
    5. Pytest之Fixture的使用
  • 用于在测试之间共享测试数据,分别在测试执行之前和之后执行设置方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    import pytest


    def sum(num1, num2):
    return num1 + num2


    @pytest.fixture()
    def get_sum_test_data():
    return [(3, 5, 8),
    (-2, -2, -4), (6, 6, 12), (6, -1, 5), (0, 5, 5)]


    def test_sum(get_sum_test_data):
    for data in get_sum_test_data:
    num1 = data[0]
    num2 = data[1]
    expected = data[2]
    assert sum(num1, num2) == expected


    def test_sum_output_type():
    assert type(sum(1, 2)) is int
  • 执行查看结果
    1
    2
    3
    4
    5
    6
    collected 2 items                                                                       

    test_example.py::test_sum PASSED [ 50%]
    test_example.py::test_sum_output_type PASSED [100%]

    =================================== 2 passed in 0.03s ===================================
  • Scope of fixture
    function: 每次测试运行一次
    class: 每类测试运行一次
    module: 每个模块运行一次
    session: 每个会话运行一次
  • 权重
    function < class <module<session
  • autouse=True
    将默认使您套件中的每个测试都使用它
  • 例如1
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    import pytest


    def sum(num1, num2):
    return num1 + num2


    @pytest.fixture(scope='session')
    def get_sum_test_data():
    return [(3, 5, 8),
    (-2, -2, -4), (6, 6, 12), (6, -1, 5), (0, 5, 5)]


    @pytest.fixture(autouse=True)
    def setup_and_teardown():
    print('\n获取数据')
    yield
    print('\n保存数据')


    def test_sum(get_sum_test_data):
    for data in get_sum_test_data:
    num1 = data[0]
    num2 = data[1]
    expected = data[2]
    assert sum(num1, num2) == expected


    def test_sum_output_type():
    assert type(sum(1, 2)) is int
  • 执行后查看结果 pytest test_example.py -v -s
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    collected 2 items                                                                       

    test_example.py::test_sum
    获取数据
    PASSED
    保存数据

    test_example.py::test_sum_output_type
    获取数据
    PASSED
    保存数据


    =================================== 2 passed in 0.02s ===================================
  • 例如2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    import pytest

    @pytest.fixture()
    def setup():
    print('在测试之前')


    def test_one(setup):
    print('测试1')


    def test_two(setup):
    print('测试2')
    • 执行结果
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      (yiluo) ➜  pytest pytest -v -s fixture.py
      ======================== test session starts =========================
      platform darwin -- Python 3.7.5, pytest-5.3.2, py-1.8.0, pluggy-0.13.1 --
      cachedir: .pytest_cache
      rootdir: /Users/joey/Code/pytest
      plugins: allure-pytest-2.8.6, rerunfailures-5.0
      collected 2 items

      fixture.py::test_one 在测试之前
      测试1
      PASSED
      fixture.py::test_two 在测试之前
      测试2
      PASSED

      ========================= 2 passed in 0.01s ==========================
  • fixture 返回值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import pytest


    @pytest.fixture(params=[1, 2, 3])
    def test_data(request):
    return request.param


    def test_assert_all(test_data):
    print('test_data: %s' % test_data)
    assert test_data != 5
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    (yiluo) ➜  pytest pytest -v -s fixture_param.py
    ======================== test session starts =========================
    platform darwin -- Python 3.7.5, pytest-5.3.2, py-1.8.0, pluggy-0.13.1 -- /Users/joey/yiluo/bin/python3
    cachedir: .pytest_cache
    plugins: allure-pytest-2.8.6, rerunfailures-5.0
    collected 3 items

    fixture_param.py::test_assert_all[1] test_data: 1
    PASSED
    fixture_param.py::test_assert_all[2] test_data: 2
    PASSED
    fixture_param.py::test_assert_all[3] test_data: 3
    PASSED

    ========================= 3 passed in 0.01s ==========================
6. pytest.mark
  • skip — 跳过测试功能
  • skipif — 如果满足特定条件,则跳过测试功能
  • xfail — 如果满足特定条件,则会产生“预期的失败”结果
  • parametrize执行对同一测试功能的多次调用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/bin/python3
    # 伊洛Yiluo
    # https://yiluotalk.com
    import pytest


    def sum(num1, num2):
    return num1 + num2


    @pytest.mark.skip
    def test_sum():
    assert sum(3, 7) == 10


    def test_sum_output_type():
    assert type(sum(1, 2)) is int
  • 执行查看结果
    1
    2
    3
    4
    5
    6
    collected 2 items                                                                       

    test_example.py::test_sum SKIPPED [ 50%]
    test_example.py::test_sum_output_type PASSED [100%]

    ============================= 1 passed, 1 skipped in 0.01s ==============================
  • 成功跳过测试用例
  • 运行的方式

    名称中带有“ validate”字符串的所有测试
    pytest -k “validate”
    排除名称中带有“ db”的测试,但包括“ validate”
    pytest -k “validate and not db”
    运行文件夹demo_tests中的所有测试文件
    pytest demo_tests/
    运行测试类TestClassDemo的单个方法test_method
    pytest demo_tests/test_example.py::TestClassDemo::test_method
    运行一个名为TestClassDemo的测试类
    pytest demo_tests/test_example.py::TestClassDemo
    运行一个名为test_sum的测试函数
    pytest demo_tests/test_example.py::test_sum
    以详细模式运行测试
    pytest -v demo_tests/
    运行包括打印语句的测试
    pytest -s demo_tests/
    仅运行上次运行失败的测试
    pytest — lf

在这里插入图片描述

欢迎下方【戳一下】【点赞】
Author:伊洛Yiluo
愿你享受每一天,Just Enjoy !

关注公众号获取更多内容

01

不知如何下笔,不知写什么内容

现在是一个内容为王的时代,很多人都投入到了创造的行列

刚开始大多会遇到不知写什么,如何去写的时间段。会感觉自己写的内容没有任何观点,内容苍白无力

甚至大多时候,写出来的文章逻辑混乱不清

本文首发于伊洛的个人博客:https://yiluotalk.com,欢迎关注并查看更多内容!!!

如何开始

写就好了!!!

做一个生活中的观察者,把自己工作中的一些经验,生活中的一些感悟,可能会对其它人有所帮助的内容总结出来,写就好了!

完成比完美更重要

让输出倒逼自己对知识的输入

多向头部学习借鉴

做任何事情都需要有反馈,有复盘,自己写好的文章多留意下别人给出的建议

多去看看头部的一些文章,借鉴别人写文中的一些优点,然后复盘自己的文章,多发现自己的不足,下次写新的文章时就要有所改进

手机系统软件都需要升级,对待文章也应该像对待产品一样,要不断的打磨迭代

02

巧用模版

还记不记得小的生活老师教写作文? 会有一些固定的句式

如果你忘记了小学怎样写作文的话

那么高中或者初中写英语作文的时候,你一定被老师要求背过固定的句式

比如

In my opinion
我的观点

Recently, the problem of …has aroused people’s concern.
最近,……问题已引起人们的注意

It is commonly believed that … / It is a common belief that …
人们一般认为……

Different people hold different attitudes toward…….
对……人们的态度各不相同

No doubt, unless we take effective measures, it is very likely that …
毫无疑问,除非我们采取有效措施,很可能会……

######老师会让你背一些“万金油” 的句子 ,然后你在写作文的时候不仅可以完美的凑齐字数,还会“显得” ,没错就是显得你的文章很漂亮

03

那么同理,写汉语当然也可以用到模版

当你引入一些观点

最近,许多媒体/学者/专家认为……

当你想表达一些观点

传统观念认为……
在我们的一生中,经常会听到这样的一种说法……
你大概会认为……

自己表达观点

我一直认为……
虽然我现在应该有了更多的了解,但我还是不禁会认为……
我即认为……又相信……

引入假设或推论

虽然没有……直接说出来,但是他们将成给我一种……
从 …… 对 ……看法中可以得出一个结论……

引入争议

关于 ……这个主题……大多数人认为……但是,共识之外……这个问题……有人坚信……其他人认为……

04

巧用连词
补充

还有,实际上,而且,事实上,此外,另外,不仅如此

承接

实际上,换言之,展开来讲,坦率的来讲,简单讲,归根结底

举例

毕竟,例如,具体来看,试想,比如

因果

据此,所以,那么,于是

平时多总结别人文章中比较好的连词

05

巧用经句
如今内容爆发,每个人的阅读都好像是在刷朋友圈

如何快速的在刷的过程中吸引到读者的注意力就很关键

就如同大家逛街,在琳琅满目的商品中要吸引到顾客的注意力 ,那么一篇文章中最好的吸引方式就是经典的句子

######注意文章中经典的语句最好加粗,让读者很容易留意

06

最好有些故事,可以让读者进入心流的状态

当每个人听故事的时候,其实是注意力最集中也是最感兴趣的时候,你肯定会留意到很多头部的文章几乎都会

这样开头

我有一个同事,我有一个闺蜜,我一个发小……

这样就可以快速的吸引读者的好奇心,很容易让读者带入到你的故事中

欢迎下方【戳一下】【点赞】
Author:伊洛Yiluo
愿你享受每一天,Just Enjoy !

关注公众号获取更多内容

本文是Python requests库 (一)的后续,简单的介绍一下python第三方库 requests的一些简单的高级用法

本文首发于伊洛的个人博客:https://yiluotalk.com,欢迎关注并查看更多内容!!!

1. 文件上传
  • 通过request 上传一张photo
    1
    2
    3
    4
    >>> import requests
    >>> files = {'file':open('photo.jpg', 'rb')}
    >>> r = requests.post('http://httpbin.org/post', files=files)
    >>> print(r.text)
    2. 获取 cookies
  • 访问知乎,然后获取cookies
    1
    2
    3
    4
    >>> import requests
    >>> r = requests.get("https://www.zhihu.com")
    >>> print(r.cookies)
    <RequestsCookieJar[<Cookie _xsrf=kpkc08adzcWJ2IZXxQAh85ujvtFiPArj for .zhihu.com/>]>
3. 会话维持
  • 如果需要访问的网页是需要登陆之后再使用的话就需要会话维持,一般在做接口自动化测试或者爬虫一些网站的时候,都是需要保持登录态
    1
    2
    3
    4
    5
    6
    7
    8
    >>> import requests
    >>> requests.get("http://httpbin.org/cookies/set/number/123456789")
    <Response [200]>
    >>> r = requests.get('http://httpbin.org/cookies')
    >>> print(r.text)
    {
    "cookies": {}
    }
  • 上面并没有获取到cookies ,因为request设置cookie和后来的获取cookie相当于打开了两个浏览器
  • 如何解决这个问题,我们需要用到session ,这是在自动化接口测试或者爬虫中经常会被用到,有必要掌握
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> import requests
    >>> s = requests.Session()
    >>> s.get('http://httpbin.org/cookies/set/number/123456789')
    <Response [200]>
    >>> r = s.get('http://httpbin.org/cookies')
    >>> print(r.text)
    {
    "cookies": {
    "number": "123456789"
    }
    }
  • 以上,成功保持会话
4. SSL证书验证
  • 你肯定会有过类似的这种经历,当你打开一个网页的时候会提示你访问的地址不安全,这是由于https协议需要证书
  • 程序访问后一定会报出 SSLError错误
  • 解决方式

1.设置verify = False
2.传入证书 cert="你的证书"

5.代理设置
  • 爬虫的时候通常会设置代理
  • 方式在proxies=输入你的代理
6. 超时设置
  • 限制应答时间,比如访问伊洛的个人博客https://yiluotalk.com ,设置超时1s
    1
    2
    3
    4
    5
    6
    # 伊洛Yiluo
    # https://yiluotalk.com
    >>> import requests
    >>> r = requests.get("https://yiluotalk.com", timeout = 1)
    >>> print(r.status_code)
    200
7.身份认证
  • 一些网站当你访问的时候首先会让你登录做验证
  • 解决方式,传入auth 参数 auth=HTTPBasicAuth('user', 'password')

在这里插入图片描述

关注公众号获取更多内容

1.什么是爬虫?

网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网网络机器人

本文首发于伊洛的个人博客:https://yiluotalk.com,欢迎关注并查看更多内容!!!

  • 其实通俗的来讲,本质上爬虫就是自动化的程序,自动化模拟人的操作。比如在网站上下载小说,下载图片,下载视频等等。如果让你本人下载1-2张图片可能很容易,但是如果让你下载100张甚至10000张图片的话,就一定会发狂了。所以就交给自动化的爬虫来帮你下载10000张图片!解放你的双手~
    2.浏览器获取数据过程
  • 浏览器向服务等发送httprequest请求
  • 服务器响应response
  • 浏览器解析数据
  • 展示给用户
    3.Rquest 和 Response
  • Request 包含内容

1.请求方式通常有Get Post Put Delete
2.请求URL
3.请求头
4.请求体

  • 来请求一些伊洛的个人博客 https://yiluotalk.com

  • 点击Network,查看headers

  • 注意一般服务器会对请求数据做校验,一般在请求头里面需要加user-agent

  • Response 包含内容

1.响应状态 ,状态码
2.响应头 response headers
3.响应体信息

  • 来看一下伊洛博客的返回
  • 返回的是html页面
4. 爬虫的过程
  • 通过上面我们已经比较清楚了,浏览器请求服务器到服务器响应,浏览器解析展示给用户的简单过程,那么我们爬虫的话大概分几步呢
    通常来说分为四个步骤
  • 1.爬取数据 发起http请求 (来用python代码演示下)
    可能需要爬取的数据是会有 Html文档Json格式文本图片视频,等
    1
    2
    3
    4
    5
    6
    # 伊洛Yiluo
    # https://yiluotalk.com
    >>> import requests
    >>> r = requests.get("https://yiluotalk.com")
    >>> print(r.status_code)
    200
  • 2.获取响应内容
    如上获取了响应的状态码为200
  • 3.解析内容
    解析的方式可能有很多种,后续展开讲述下
  1. 直接处理
  2. Json 解析
  3. 正则表达式
  4. 有很多好用的第三方库,比如 BeautifulSoup pyquery scrapy 还有xpath也可以
    1
    2
    3
    # 伊洛Yiluo
    # https://yiluotalk.com
    print(r.text)
  • 响应的是html文件

5.保存数据

  • 保存数据一般分为以下几种,后续展开来讲
    纯文本Json Xml关系形数据库(Mysql)非关系型数据库(Mongodb)二进制文件
    5. 找不到要爬取的数据
    由于一些网站的页面是动态获取的,所以最后你看到的页面可能是通过js渲染出来的,那么怎么来处理呢,简单的可以分为

1.分析ajax请求,json格式字符串
2.selenium webdriver 浏览器驱动
3.splash
4.pyv8ghost8

  • 这里先简单的介绍下模拟人工浏览器的方式,也就是 WEB自动化测试经常用到的,selenium ,可以翻下伊洛之前介绍selenium webdriver自动化测试的的相关文章
  • 依旧是访问 https://yiluotalk.com
  • 输入网址
  • 这样通过浏览器驱动的方式访问的就会正确的获得响应的所有信息

在这里插入图片描述

欢迎下方【戳一下】【点赞】
Author:伊洛Yiluo
愿你享受每一天,Just Enjoy !

关注公众号获取更多内容

大家新年好呀,今天再来说下Python老司机常用的小技巧,让你告别‘乏味的’if-elif,话不多说直接来看一个输出今天周几的例子

本文首发于伊洛的个人博客:https://yiluotalk.com,欢迎关注并查看更多内容!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 伊洛Yiluo
# https://yiluotalk.com

import datetime

week_day = datetime.date(2020, 1, 2)

if week_day.weekday() == 0:
print('今天是星期一')
elif week_day.weekday() == 1:
print('今天是星期二')
elif week_day.weekday() == 2:
print('今天是星期三')
elif week_day.weekday() == 3:
print('今天是星期四')
elif week_day.weekday() == 4:
print('今天是星期五')
elif week_day.weekday() == 5:
print('今天是星期六')
elif week_day.weekday() == 6:
print('今天是星期日')
  • weekday()函数返回的是当前日期所在的星期数
  • 运行看以下结果
    1
    2
    3
    今天是星期四

    Process finished with exit code 0
  • 没错今天就是周四
  • 可以看到上面的代码看上去好像很复杂而且码代码的时候也很容易出现错误,比如你入门python的时候肯定会做一些类似于工资计算器的小程序,你计算公积金或者税率工资分段的时候要不断的用到if-elif,这样很容易出现错误
  • 那么有没有更好的方式避免或者优化呢
  • 当然作为python老司机的话都会用到调度表
  • 简单来看一个例子
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 伊洛Yiluo
    # https://yiluotalk.com

    import datetime

    dispatch = {
    0: '今天是星期一',
    1: '今天是星期二',
    2: '今天是星期三',
    3: '今天是星期四',
    4: '今天是星期五',
    5: '今天是星期六',
    6: '今天是星期日'
    }

    week_day = datetime.date(2020, 1, 2)

    print(dispatch[week_day.weekday()])
  • 这里其实就是一个python的字典
  • 看上去是不是稍微的简洁简化了呢
  • 重要的是会避免出错(当你if-elif很多的情况下,就一定会有这种体会了)
  • 最后来输出看看结果
    1
    2
    3
    今天是星期四

    Process finished with exit code 0
  • 结果一致,适当的放弃if-elif吧,让你的代码不仅美观还少出错

在这里插入图片描述

欢迎下方【戳一下】【点赞】
Author:伊洛Yiluo
愿你享受每一天,Just Enjoy !

关注公众号获取更多内容

  • 最近开会打算把手机投屏到自己的Mac上演示用,于是就打算用下听了很久好用但是一值没有使用的AirServer
  • 十分简单的操作就可以完美的投屏到Mac电脑,而且不用像Mac自带的QuickTime用线连接手机
  • 画外音:自动化测试中有个好用的开源项目,Airtest Project,其实不仅可以在电脑显示手机屏幕,而且还可以对手机进行操作,由于本篇内容是讲投屏AirServer,这里不在赘诉,想了解自动化工具的小伙伴可以自行谷歌或百度Airtest Project

    本文首发于伊洛的个人博客:https://yiluotalk.com,欢迎关注并查看更多内容!!!

1. 安装 AirServer
  • 打开官网,然后download
    https://www.airserver.com/

    2. Mac电脑将程序拖动到 App
  • 官网下载的是试用的版本,如果激活的话可以购买正版

  • 富裕的小伙伴还是尽量支持正版,不太方便的小伙伴可以考虑万能的谷歌或百度寻求新大陆

    3. 启动Air Server

    启动成功

    3. 配置投屏连接权限
  • 同一网络下默认是可以直接投屏到服务上的,所以为了安全起见还是设置以下投屏的权限
    设置

  • 四种方式分别是:没有密码,固定密码,屏幕显示code, 询问

  • 这里伊洛选择了请求投屏的时候,屏幕显示code

    4. 手机端下拉(iPhone)选择屏幕镜像,然后选择你的Mac设备
  • 这样屏幕上就会显示code
    屏幕上显示code

  • 手机端输入屏幕上的code
    成功投屏到Mac
    在这里插入图片描述

    5. 横屏可以看视频或玩游戏都行,可以放大。声音也可以配置(游戏画面还是会有延迟的,看视频效果还不错)(图片来自爱奇艺截图)

    截图来自爱奇艺
    关注公众号获取更多内容

欢迎下方【戳一下】【点赞】
Author:伊洛Yiluo
愿你享受每一天,Just Enjoy !

  • 生活中很多事情都会有反馈机制,比如考试完,成绩就是对这段时间学习效果的反馈;玩游戏经验值就是对你在游戏中投入精力的反馈等等。那么对于程序来说也需要反馈,比如安装一个软件,如果没有进度条,那么你一定会很抓狂。因为你根本无法确认程序是否在正常工作,还是任务已经被已系统挂起。那么本文就简单的介绍几种python常用到的反馈进度条方式(包括GUI进度条)

    本文首发于伊洛的个人博客:https://yiluotalk.com,欢迎关注并查看更多内容!!!

1. 使用 Progress
  • 安装
    1
    2
    3
    4
    5
    6
    (yiluo) ➜  ~ pip install progress
    Collecting progress
    Downloading https://files.pythonhosted.org/packages/38/ef/2e887b3d2b248916fc2121889ce68af8a16aaddbe82f9ae6533c24ff0d2b/progress-1.5.tar.gz
    Installing collected packages: progress
    Running setup.py install for progress ... done
    Successfully installed progress-1.5
  • 创建一个脚本,写入以下代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 伊洛Yiluo 
    # https://yiluotalk.com

    import time
    from progress.bar import IncrementalBar

    bar_list = [1, 2, 3, 4, 5, 6, 7, 8]

    bar = IncrementalBar('progress bar', max=len(bar_list))


    if __name__ == '__main__':
    for i in bar_list:
    bar.next()
    time.sleep(1)

    bar.finish()
  • 命令行运行
    1
    2
    (yiluo) ➜  AllDemo python demo.py
    progress bar |████████████ | 3/8
    2. 使用 Tqdm
  • 安装
    1
    2
    3
    4
    5
    6
    pip install tqdm
    Collecting tqdm
    Downloading https://files.pythonhosted.org/packages/8c/c3/d049cf3fb31094ee045ec1ee29fffac218c91e82c8838c49ab4c3e52627b/tqdm-4.41.0-py2.py3-none-any.whl (56kB)
    |████████████████████████████████| 61kB 239kB/s
    Installing collected packages: tqdm
    Successfully installed tqdm-4.41.0
  • 写入以下代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 伊洛Yiluo
    # https://yiluotalk.com

    import time
    from tqdm import tqdm

    _bar = [1, 2, 3, 4, 5, 6, 7, 8]


    for item in tqdm(_bar):
    time.sleep(1)
  • 命令行运行
    1
    2
    (yiluo) ➜  AllDemo python demo.py
    62%|█████████████████████████████████▊ | 5/8
    3. 使用 Alive Progress
  • 也是很常用的,和之前例子相差不大,有兴趣的可以看以下具体的使用文档
    Alive Progress 传送门
    4. 使用 Pysimplegui(GUI)
  • 安装
    1
    2
    3
    4
    5
    6
    (yiluo) ➜  ~ pip install pysimplegui
    Collecting pysimplegui
    Downloading https://files.pythonhosted.org/packages/22/a8/ec06b5ce8997411c542dc0f65848a89b6f852b1b9c0fde8ace89aec6703e/PySimpleGUI-4.14.1-py3-none-any.whl (288kB)
    |████████████████████████████████| 296kB 286kB/s
    Installing collected packages: pysimplegui
    Successfully installed pysimplegui-4.14.1
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 伊洛Yiluo
    # https://yiluotalk.com

    import PySimpleGUI as sg
    import time
    bar_list = [1, 2, 3, 4, 5, 6, 7, 8]

    for i, item in enumerate(bar_list):
    sg.one_line_progress_meter('我是进度条!', i+1, len(bar_list), 'key')
    time.sleep(1)
  • 来看看GUI的效果

    在这里插入图片描述
    关注公众号获取更多内容

    欢迎下方【戳一下】【点赞】
    Author:伊洛Yiluo
    愿你享受每一天,Just Enjoy !

写在前面—Python的优势在于

1.与主要平台和操作系统兼容
2.许多开源框架和工具
3.可读且可维护的代码
4.强大的标准库
5.标准测试驱动的开发

本文首发于伊洛的个人博客:https://yiluotalk.com,欢迎关注并查看更多内容!!!

  • 话不多说了,本文是第二部分,将讲简单的列出几条日常工作中使用Python可能会用到的语法小技巧,希望会对你的工作有所帮助 just enjoy!
    第一部分是:老司机都知道的Python语法小技巧 (一)
    14.列表中元素出现的个数
    1
    2
    3
    4
    5
    6
    7
    # 伊洛Yiluo
    # https://yiluotalk.com
    >>> from collections import Counter
    >>> list = [1,2,3,4,5,1,2,3,4,5,6]
    >>> count = Counter(list)
    >>> count
    Counter({1: 2, 2: 2, 3: 2, 4: 2, 5: 2, 6: 1})
    15.列表中查找出现最多的元素
    1
    2
    3
    4
    5
    6
    7
    8
    # 伊洛Yiluo
    # https://yiluotalk.com
    >>> def most_frequement(list):
    ... return max(set(list), key = list.count)
    ...
    >>> number = [1,2,3,4,5,6,5,5,5,5,5]
    >>> most_frequement(number)
    5
    16. 将角度从度转换为弧度
    1
    2
    3
    4
    5
    6
    7
    # 伊洛Yiluo
    # https://yiluotalk.com
    >>> import math
    >>> def degrees_to_radians(deg):
    ... return (deg * math.pi) / 180
    >>> degrees_to_radians(90)
    1.5707963267948966
    17. 计算执行一段代码所花费的时间(非装饰器)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 伊洛Yiluo
    # https://yiluotalk.com
    import time
    start_time = time.time()
    a, b = 10, 20
    c = a + b
    end_time = time.time()
    time_taken = (end_time- start_time)*(10**6)
    print('耗时', time_taken)


    output
    耗时 2.1457672119140625

    Process finished with exit code 0
    18. 字符串去重
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 伊洛Yiluo
    # https://yiluotalk.com
    >>> string = "aabbccddeeffgg"
    >>> unique = set(string)
    >>> unique
    {'a', 'f', 'b', 'g', 'c', 'e', 'd'}
    >>> new_string = ''.join(unique)
    >>> new_string
    'afbgced'
    19. 使用lambda表达式
    1
    2
    3
    4
    5
    # 伊洛Yiluo
    # https://yiluotalk.com
    >>> x = lambda a, b, c :a + b + c
    >>> print(x(1, 2, 3))
    6
    20. 使用 filter
    1
    2
    3
    4
    5
    6
    # 伊洛Yiluo
    # https://yiluotalk.com
    >>> arr = [1, 2, 3, 4, 5]
    >>> arr = list(filter(lambda x : x%2 == 0, arr))
    >>> print(arr)
    [2, 4]
    21. 列表
    1
    2
    3
    4
    5
    6
    # 伊洛Yiluo
    # https://yiluotalk.com
    >>> number = [1, 2, 3]
    >>> squares = [number**2 for number in number]
    >>> print(squares)
    [1, 4, 9]
    22. 切片
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 伊洛Yiluo
    # https://yiluotalk.com
    >>> def rotate(arr, d):
    ... return arr[d:] + arr[:d]
    ...
    >>> arr = [1,2,3,4,5]
    >>> arr = rotate(arr, 2)
    >>> print(arr)
    [3, 4, 5, 1, 2]
    23. 链式函数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 伊洛Yiluo
    # https://yiluotalk.com
    >>> def subtract(a, b):
    ... return a - b
    ...
    >>> def add(a, b):
    ... return a + b
    ...
    >>> def subtract(a, b):
    ... return a - b
    ...
    >>> a, b = 5, 10
    >>> print((subtract if a > b else add)(a, b))
    15
    >>> a, b = 10, 5
    >>> print((subtract if a > b else add)(a, b))
    5
    在这里插入图片描述

欢迎下方【戳一下】【点赞】
Author:伊洛Yiluo
愿你享受每一天,Just Enjoy !

关注公众号获取更多内容