Python高阶技巧全解

有时候,不是因为你没有能力,也不是因为你缺少勇气,只是因为你付出的努力还太少,所以,成功便不会走向你。而你所需要做的,就是坚定你的梦想,你的目标,你的未来,然后以不达目的誓不罢休的那股劲,去付出你的努力,成功就会慢慢向你靠近。

导读:本篇文章讲解 Python高阶技巧全解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1、闭包

1.1、为什么要使用闭包

一下代码是模拟ATM机器存取款的代码,咱们看下有什么问题

# 账户总余款
account_amount = 0


def atm(num, deposit=True):
    """
    ATM机器
    :param num: 存取款金额
    :param deposit: 是否是存款,默认true
    :return:
    """

    global account_amount
    if deposit:
        account_amount += num
        print(f"存款:{num},账户余额:{account_amount}")
    else:
        account_amount -= num
        print(f"取款:{num},账户余额:{account_amount}")


if __name__ == '__main__':
    # 存款
    atm(300)
    # 存款
    atm(300)
    # 取款款
    atm(100, False)
Python高阶技巧全解

总结:

通过全局变量account_amount记录账户余款,尽管功能实现没有问题,但是存在一下问题

①、代码在命名空间上不够干净(变量定义)、整洁

②、全局变量有被修改的风险

由于存在以上两个问题,我们需要使用到闭包

1.2、使用闭包

我们将1.1代码改造如下:

def account_create(init_amount=0):
    def atm(num, deposit=True):
        # 注意:需要使用nonlocal 关键字修饰外部函数的变量,才可以在内部函数中修改它
        nonlocal init_amount
        """
        ATM机器
        :param num: 存取款金额
        :param deposit: 是否是存款,默认true
        :return:
        """

        if deposit:
            init_amount += num
            print(f"存款:{num},账户余额:{init_amount}")
        else:
            init_amount -= num
            print(f"取款:{num},账户余额:{init_amount}")

    return atm


if __name__ == '__main__':
    fn = account_create(0)
    fn(300)
    fn(200)
    fn(100, False)

在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。

1.3、简单闭包

def outer(logo):
    def inner(msg):
        print(f"{logo}:{msg}")

    return inner


if __name__ == '__main__':
    fn1 = outer("张三")
    fn1("大家好")

    fn2 = outer("李四")
    fn2("hello,大家好")
Python高阶技巧全解

1.4、闭包的注意点

  • 优点:

无需定义全局变量即可实现通过函数,持续的访问、修改某个值

闭包使用的变量的所用于在函数内,难以被错误的调用修改

  • 缺点:

由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放,一直占用内存

2、装饰器

装饰器其实也是一种闭包, 其功能就是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能。

def outer(func):
    def inner():
        print("我要睡觉了")
        func()
        print("我起床了")

    return inner


"""
    这里要增加 @外部的方法名
"""


@outer
def sleep():
    import random
    import time
    print("睡眠中....")
    time.sleep(random.randint(1, 3))


if __name__ == '__main__':
    sleep()
Python高阶技巧全解

3、单例模式

单例模式需要通过两个文件实现

定义test_10.py 文件,内容如下

class StrTools:
    pass


str_tools = StrTools()

定义test_11.py文件,内容如下

from test_10 import str_tools

if __name__ == '__main__':
    s1 = str_tools
    s2 = str_tools
    # 如果打印的s1和s2内存地址一致,则说明单例成功
    print(s1)
    print(s2)
Python高阶技巧全解

4、工厂模式

"""
定义人类
"""


class Person:

    def introduce(self):
        """
        自我介绍
        :return:
        """
        pass


"""
定义工人,继承至Person
"""


class Worker(Person):
    def introduce(self):
        """
        自我介绍
        :return:
        """
        print("我是工人")


"""
定义学生
"""


class Student(Person):
    def introduce(self):
        """
        自我介绍
        :return:
        """
        print("我是学生")


"""
定义教师
"""


class Teacher(Person):
    def introduce(self):
        """
        自我介绍
        :return:
        """
        print("我是教师")


"""
定义工厂类
"""


class Factory:
    def create_person(self, p_type) -> Person:
        """
        创建人类
        :param p_type: 类型
        :return:
        """
        if p_type == 'w':
            return Worker()
        elif p_type == 's':
            return Student()
        else:
            return Teacher()
        return None


if __name__ == '__main__':
    f = Factory()
    w = f.create_person("w")
    s = f.create_person("s")
    t = f.create_person("t")
    w.introduce()
    s.introduce()
    t.introduce()
Python高阶技巧全解

5、多线程编程

绝大多数编程语言,都允许多线程编程,Pyhton也不例外。

Python的多线程可以通过threading模块来实现。

Python高阶技巧全解

Python高阶技巧全解

5.1、实例

import threading
import time


def sing(arg):
    """
    定义唱歌方法,无限循环
    :return:
    """
    while True:
        print(arg)
        time.sleep(1)


def dance(arg):
    """
    跳舞,无限循环
    :return:
    """
    while True:
        print(arg)
        time.sleep(1)


if __name__ == '__main__':
    # 注意这里,target=函数名称,不能加小括号,否则线程无效 
    sing_thread = threading.Thread(target=sing, args=("我在唱歌",))
    dance_thread = threading.Thread(target=dance, args=("我在跳舞",))
    sing_thread.start()
    dance_thread.start()
Python高阶技巧全解

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/144606.html

(0)

相关推荐

  • Traefik 2 基础授权验证(后篇)

    Traefik 2 基础授权验证(后篇) 上篇文章中,我们提到了 Traefik 的 Forward Auth,本篇内容我们来展开聊聊如何使用它。 准备基础的 Web 服务Demo…

    2022年8月14日
    00
  • SpringCloud-7-Spring Boot使用Jetty容器

    在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

    导读:本篇文章讲解 SpringCloud-7-Spring Boot使用Jetty容器,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

    Java自学入门 2023年3月5日
    00
  • matplotlib中修改默认字体

    导读:本篇文章讲解 matplotlib中修改默认字体,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    Java 2022年5月23日
    00
  • Shell学习-08-分支结构if else

    在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

    导读:本篇文章讲解 Shell学习-08-分支结构if else,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

    Java自学入门 2023年3月5日
    00
  • 《Java学习笔记》:日期类常用方法全归纳,值得收藏。

    导读:本篇文章讲解 《Java学习笔记》:日期类常用方法全归纳,值得收藏。,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    后端开发 2022年12月30日
    00
  • git-2-git基本理论及项目创建

    在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

    导读:本篇文章讲解 git-2-git基本理论及项目创建,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

    2023年3月5日
    00
  • 灵活的令人抓狂,如何在运行时修改某一个 Python 对象的类?

    你好,我是 somenzz,可以叫我征哥。 这样的场景你也可能遇到:调试的时候,我需要追踪某一个 Python 对象的属性变化,比如对象 someobj = SomeClass()…

    2022年10月9日
    00
  • android开发,使用kotlin学习Room

    导读:本篇文章讲解 android开发,使用kotlin学习Room,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    Android 2023年2月10日
    00
  • 4. Django配置runserver实现远程访问

    使用监听所有ip的启动方式 如果是在另一台电脑上web访问要用 Python manage.py ip:port (一般使用8000)的形式;监听所有ip用0.0.0.0如下: p…

    2022年9月25日
    00
  • SpringMVC-09-传递参数的几种方式

    在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

    导读:本篇文章讲解 SpringMVC-09-传递参数的几种方式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

    Java自学入门 2023年3月5日
    00

发表回复

登录后才能评论