关于python程序结构输出值的运算

img


关于python程序结构输出值的运算 为什么是循环三次 怎么算的

range(5,0,-2)
的意思是,从5开始,每次-2,大于0
第一次5
第二次3
第三次1
第四次-1不满足,不循环
所以3次

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7548611
  • 这篇博客你也可以参考下:这可能是Python中最快的质数计算方案 Python 质数计算 素数计算 多进程 多线程 超高速并行计算
  • 你还可以看下python参考手册中的 python- 源文件的字符编码
  • 除此之外, 这篇博客: 【Python从入门到精通】(二十一)Python并发编程互斥锁的运用以及线程通信中的 线程安全的问题 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    多线程用起来挺爽的,就是一不小心就可能会出现并发问题。比如:两个小孩争抢同一个糖果,两个线程对同一个共享资源进行访问。举个栗子吧!现在某个账户中有2000块钱。甲乙丙(三个线程)同时从该账户中取钱,每个人线程分别取800块。按照期望的总有一个线程取钱失败。因为账户的余额不能为负数。但是在并发情况下极有可能三个人都取钱成功,最终的账户余额为负数。

    import threading
    class Account:
        # 定义构造函数
        def __init__(self, account_no, balance):
            """
            :param account_no:  账户
            :param balance:  余额
            """
            self.account_no = account_no
            self._balance = balance
    
        def draw(self, draw_amount):
            """
            :param draw_amount: 需要取的钱
            :return:
            """
            if self._balance > draw_amount:
                print(threading.current_thread().getName() + '从' + self.account_no + " 取钱成功,账户取出金额是:" + str(
                    draw_amount) + "\n")
                self._balance = self._balance - draw_amount
                print('账户余额是', self._balance)
            else:
                print(threading.current_thread().getName() + '从' + self.account_no + " 取钱失败\n")
    
    
    # 两个线程并发取钱
    account = Account('账户一', 2000)
    threading.Thread(target=account.draw, name='线程一', args=(800,)).start()
    threading.Thread(target=account.draw, name='线程二', args=(800,)).start()
    threading.Thread(target=account.draw, name='线程三', args=(800,)).start()
    

    极有可能出现如下运行结果:

    线程一从账户一 取钱成功,账户取出金额是:800
    线程二从账户一 取钱成功,账户取出金额是:800
    
    账户余额是 1200
    线程三从账户一 取钱成功,账户取出金额是:800
    
    账户余额是 400
    
    账户余额是 -400
    

    这就是对共享资源不加控制引发的线程安全问题。线程安全问题出现一般有如下两种情况:

    1. 可见性问题: 由于CPU缓存导致的可见性问题,导致线程一对共享变量A的操作不能立即被线程二看到,这就导致线程二取到的还是旧值。
    2. 原子性问题: 比如:self._balance = self._balance - draw_amount 这个语句并不是一个原子的CPU执行命令。这个语句的执行共有三条CPU命令,分别是:
      1. 指令一:将self._balance的值从内存加载到CPU的寄存器中。
      2. 指令二:在寄存器中执行self._balance - draw_amount操作。
      3. 指令三:将新值写入到内存中(由于存在缓存机制,写入的可能是CPU缓存而不是堆内存)。
        一般认为单条CPU指令是原子的,但是在执行多条CPU指令时可能随时会发生线程切换。切换之后的线程取到的值还是老值。
  • 您还可以看一下 王宁宁老师的Python数据结构与算法视频教程课程中的 Python 数据结构与算法课程简介小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^