• Python输入输出

    在上一节 数学运算 中,我们学会了在 Python 终端计算圆的面积,如下:

    1
    2
    3
    
    >>> pi = 3.14159
    >>> pi * 1.5 ** 2
    7.065
    

    但是,这样的方式多用于临时计算,不够灵活。 那么,我们能否编写一个完整的程序,根据用户输入的圆半径,计算圆面积并输出到屏幕呢?

    首先,我们来对程序进行分解:

    1. 获取用户输入内容,即圆的半径;
    2. 根据输入内容,计算圆的面积;
    3. 输出相应的计算结果;
    阅读全文
  • 神奇的弱引用

    背景

    开始讨论弱引用( weakref )之前,我们先来看看什么是弱引用?它到底有什么作用?

    假设我们有一个多线程程序,并发处理应用数据:

    1
    2
    3
    4
    
    # 占用大量资源,创建销毁成本很高
    class Data:
        def __init__(self, key):
            pass
    

    应用数据 Data 由一个 key 唯一标识,同一个数据可能被多个线程同时访问。由于 Data 需要占用很多系统资源,创建和消费的成本很高。我们希望 Data 在程序中只维护一个副本,就算被多个线程同时访问,也不想重复创建。

    阅读全文
  • Python条件判断

    考试成绩出来了,同学们都考得怎么样呢?心里不禁忐忑起来。

    老师说,成绩达到 60 分或以上的才及格,不及格的童鞋要完成额外布置的作业!!! 那么,怎么让 Python 帮我们判断成绩是不是及格呢?

    if 语句

    我们可以用 if 语句来判断某个成绩是否及格,示例程序如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    # -*- encoding=utf8 -*-
    
    # 提示用户输入分数,获取用户输入内容,并保存到变量 data
    data = input('请输入分数:')
    
    # 将用户输入分数从字符串转成整数数值,并保存到变量 score
    score = int(data)
    
    # 判断分数是否大于等于60
    if score >= 60:
        print('成绩及格!')
    
    阅读全文
  • Python多线程编程技术概述

    线程是计算机程序实现并发处理的重要手段,它共享进程地址空间等资源,却可独立调度。与进程相比,线程更加轻量级,线程间通讯也更为便捷。

    线程使用方法因操作系统而异,操作系统原生多线程编程 API 也是五花八门。 Python 将线程编程 原语 进一步抽象,并提供一套简洁的通用 API ,复杂度已降到最低。

    接下来,我们以一个最简单的例子,一览为快。

    阅读全文
  • Python循环语句

    在前面的章节,我们学习了如何在屏幕上输出文本,例如 Hello world。 那么,如果要输出 3Hello world ,该如何操作呢? 我们可以暴力解决,连写 3 行代码:

    1
    2
    3
    
    print('Hello world')
    print('Hello world')
    print('Hello world')
    

    但是,如果要输出 1000 次?10000 次呢?显然,这种方式并不理想。

    为了更好地执行重复性任务,循环 语句应运而生。 循环语句是程序控制结构中的一种,可以让计算机重复执行任务。 Python 中有两种不同的循环语句,我们分别介绍:

    • for语句
    • while语句

    for语句

    借助 for 循环结构,我们可以这样输出 3Hello world

    1
    2
    3
    4
    5
    6
    
    >>> for i in range(3):
    ...     print('Hello world')
    ...
    Hello world
    Hello world
    Hello world
    
    阅读全文
  • Python多进程编程技术概述

    进程是系统进行资源分配和调度的基本单位,拥有独立的地址空间。与线程相比,进程由于资源独立,运行更为稳定。另一方面,进程却不如线程轻量,创建开销更大。

    合理应用多进程编程技巧,对提升程序多核处理能力意义重大。然而,进程使用方法因操作系统而异,操作系统原生多进程编程 API 也是五花八门。 Python 将进程编程 原语 进一步抽象,并提供一套简洁的通用 API ,复杂度已降到最低。

    接下来,我们以一个最简单的例子,一览为快。

    阅读全文
  • Python列表对象list入门

    班里成立了一支篮球队,最初由 Tim5 名同学组成。 如何对篮球队员进行管理呢? 学完本节的 列表对象 ,这个问题对你来说将是小菜一碟。

    概述

    列表 ( list ) 是 Python 的基本数据类型之一,它是一种 有序集合 ,用 []元素 围起来,元素间以 逗号 分隔。 例如, [1, 2, 3, 4, 5] 就是一个 list

    1
    2
    
    >>> [1, 2, 3, 4, 5]
    [1, 2, 3, 4, 5]
    

    该列表中保存了 5 个数字,像这种用于存储数据的对象,被称为 容器对象

    那么,怎么用 list 来管理球队成员呢? 我们可以用一个 list 来存储这些同学的信息:

    阅读全文
  • deque 对象,快如闪电的双端队列

    我们已经学习了 list 对象的内部结构,知道它底层是用动态数组实现的。在 list 头部进行插入或删除,都要挪动其后的所有数据,性能非常差!因此,我们不能将 list 对象作为队列使用。

    好在 Python 标准库提供了另一种对象—— deque ,很好地补全了 list 的短板。deque 是一种类似 list 的线性表,但它在两端插入删除数据的时间复杂度都是 $O(1)$ ,因而可以作为队列来使用。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    from collections imoprt deque
    
    # 创建一个deque对象作为队列
    q = deque()
    
    # 数据入队:将其插到末尾
    q.append(data)
    
    # 数据出队:从头部弹出
    data = q.popleft()
    

    您可能会问了,deque 到底跟 list 有何不同?为何两端都能同时支持 $O(1)$ 的插入删除呢?

    阅读全文
  • Python元组对象tuple入门

    班级新来了一个女同学 Joe ,如果要记录她的名字、性别和年龄,可以选用 Python 的哪种数据类型来保存呢?

    概述

    实际上, Python 提供了一种数据类型 —— 元组 ( tuple ) ,可以很好地保存此类数据。 元组是一种 有序集合,用括号 () 将元素包含在内,各个元素之间以 逗号 隔开。

    例如,我们可以这样来存储 Joe 的信息,包括名字、性别和年龄:

    1
    
    >>> student = ('Joe', 'female', 20)
    
    阅读全文
  • Python字典对象dict入门

    现有一个水果篮,里面放了 3 个苹果、10 个橙子、8 个香蕉。大家想一想,如果要用 Python 来记录水果篮里面每种水果的数量,该怎么做呢?

    通过 Python列表对象入门 一节,我们知道列表可以用来存储多个数据。因此,我们可以用两个列表 fruitsnumbers ,来分别记录水果的种类和数量:

    1
    2
    
    >>> fruits = ['apple', 'orange', 'banana']
    >>> numbers = [3, 10, 8]
    
    阅读全文