zoukankan      html  css  js  c++  java
  • Python:Day02

    指令和程序

    计算机的硬件系统通常由五大部件构成,包括:运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器放在一起就是我们通常所说的中央处理器,它的功能是执行各种运算和控制指令以及处理计算机软件中的数据。我们通常所说的程序实际上就是指令的集合,我们程序就是将一系列的指令按照某种方式组织到一起,然后通过这些指令去控制计算机做我们想让它做的事情。今天我们使用的计算机虽然器件做工越来越精密,处理能力越来越强大,但究其本质来说仍然属于“冯·诺依曼结构”的计算机。“冯·诺依曼结构”有两个关键点,一是指出要将存储设备与中央处理器分开,二是提出了将数据以二进制方式编码。二进制是一种“逢二进一”的计数法,跟我们人类使用的“逢十进一”的计数法没有实质性的区别,人类因为有十根手指所以使用了十进制(因为在数数时十根手指用完之后就只能进位了,当然凡事都有例外,玛雅人可能是因为长年光着脚的原因把脚趾头也算上了,于是他们使用了二十进制的计数法,在这种计数法的指导下玛雅人的历法就与我们平常使用的历法不一样,而按照玛雅人的历法,2012年是上一个所谓的“太阳纪”的最后一年,而2013年则是新的“太阳纪”的开始,后来这件事情被以讹传讹的方式误传为”2012年是玛雅人预言的世界末日“这种荒诞的说法,今天我们可以大胆的猜测,玛雅文明之所以发展缓慢估计也与使用了二十进制有关)。对于计算机来说,二进制在物理器件上来说是最容易实现的(高电压表示1,低电压表示0),于是在“冯·诺依曼结构”的计算机都使用了二进制。虽然我们并不需要每个程序员都能够使用二进制的思维方式来工作,但是了解二进制以及它与我们生活中的十进制之间的转换关系,以及二进制与八进制和十六进制的转换关系还是有必要的。如果你对这一点不熟悉,可以自行使用维基百科或者百度百科科普一下。

    变量和类型

    在程序设计中,变量是一种存储数据的载体。计算机中的变量是实际存在的数据或者说是存储器中存储数据的一块内存空间,变量的值可以被读取和修改,这是所有计算和控制的基础。计算机能处理的数据有很多中类型,除了数值之外还可以处理文本、图形、音频、视频等各种各样的数据,那么不同的数据就需要定义不同的存储类型。Python中的数据类型很多,而且也允许我们自定义新的数据类型(这一点在后面会讲到),我们先介绍几种常用的数据类型。

    • 整型:Python中可以处理任意大小的整数(Python 2.x中有int和long两种类型的整数,但这种区分对Python来说意义不大,因此在Python 3.x中整数只有int这一种了),而且支持二进制(如0b100,换算成十进制是4)、八进制(如0o100,换算成十进制是64)、十进制(100)和十六进制(0x100,换算成十进制是256)的表示法。
    • 浮点型:浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,浮点数除了数学写法(如123.456)之外还支持科学计数法(如1.23456e2)。
    • 字符串型:字符串是以单引号或双引号括起来的任意文本,比如'hello'"hello",字符串还有原始字符串表示法、字节字符串表示法、Unicode字符串表示法,而且可以书写成多行的形式(用三个单引号或三个双引号开头,三个单引号或三个双引号结尾)。
    • 布尔型:布尔值只有TrueFalse两种值,要么是True,要么是False,在Python中,可以直接用TrueFalse表示布尔值(请注意大小写),也可以通过布尔运算计算出来(例如3 < 5会产生布尔值True,而2 == 1会产生布尔值False)。
    • 复数型:形如3+5j,跟数学上的复数表示一样,唯一不同的是虚部的i换成了j

    变量命名

    对于每个变量我们需要给它取一个名字,就如同我们每个人都有属于自己的响亮的名字一样。在Python中,变量命名需要遵循以下这些必须遵守硬性规则和强烈建议遵守的非硬性规则。

    • 硬性规则:
      • 变量名由字母(广义的Unicode字符,不包括特殊字符)、数字和下划线构成,数字不能开头。
      • 大小写敏感(大写的a和小写的A是两个不同的变量)。
      • 不要跟关键字(有特殊含义的单词,后面会讲到)和系统保留字(如函数、模块等的名字)冲突。
    • PEP 8要求:
      • 用小写字母拼写,多个单词用下划线连接。
      • 受保护的实例属性用单个下划线开头(后面会讲到)。
      • 私有的实例属性用两个下划线开头(后面会讲到)。

    当然,作为一个专业的程序员,给变量(事实上应该是所有的标识符)命名时做到见名知意也是非常重要的。

    变量的使用

    下面通过几个例子来说明变量的类型和变量使用。

    """
    使用变量保存数据并进行算术运算
    
    Version: 0.1
    Author: 骆昊
    """
    
    a = 321
    b = 123
    print(a + b)
    print(a - b)
    print(a * b)
    print(a / b)
    print(a // b)
    print(a % b)
    print(a ** b)
    
    """
    使用input函数输入
    使用int()进行类型转换
    用占位符格式化输出的字符串
    
    Version: 0.1
    Author: 骆昊
    """
    
    a = int(input('a = '))
    b = int(input('b = '))
    print('%d + %d = %d' % (a, b, a + b))
    print('%d - %d = %d' % (a, b, a - b))
    print('%d * %d = %d' % (a, b, a * b))
    print('%d / %d = %f' % (a, b, a / b))
    print('%d // %d = %d' % (a, b, a // b))
    print('%d %% %d = %d' % (a, b, a % b))
    print('%d ** %d = %d' % (a, b, a ** b))
    
    """
    使用type()检查变量的类型
    
    Version: 0.1
    Author: 骆昊
    Date: 2018-02-27
    """
    
    a = 100
    b = 12.345
    c = 1 + 5j
    d = 'hello, world'
    e = True
    print(type(a))
    print(type(b))
    print(type(c))
    print(type(d))
    print(type(e))
    

    在对变量类型进行转换时可以使用Python的内置函数(准确的说下面列出的并不是真正意义上的函数,而是后面我们要讲到的创建对象的构造方法)。

    • int():将一个数值或字符串转换成整数,可以指定进制。
    • float():将一个字符串转换成浮点数。
    • str():将指定的对象转换成字符串形式,可以指定编码。
    • chr():将整数转换成该编码对应的字符串(一个字符)。
    • ord():将字符串(一个字符)转换成对应的编码(整数)。

    运算符

    Python支持多种运算符,下表大致按照优先级从高到低的顺序列出了所有的运算符,我们会陆续使用到它们。

    运算符描述
    [] [:] 下标,切片
    ** 指数
    ~ + - 按位取反, 正负号
    * / % // 乘,除,模,整除
    + - 加,减
    >> << 右移,左移
    & 按位与
    ^ ` `
    <= < > >= 小于等于,小于,大于,大于等于
    == != 等于,不等于
    is is not 身份运算符
    in not in 成员运算符
    not or and 逻辑运算符
    = += -= *= /= %= //= **= &= ` = ^= >>= <<=`

    **说明:**在实际开发中,如果搞不清楚优先级可以使用括号来确保运算的执行顺序。

    下面的例子演示了运算符的使用。

    """
    运算符的使用
    
    Version: 0.1
    Author: 骆昊
    """
    
    a = 5
    b = 10
    c = 3
    d = 4
    e = 5
    a += b
    a -= c
    a *= d
    a /= e
    print("a = ", a)
    
    flag1 = 3 > 2
    flag2 = 2 < 1
    flag3 = flag1 and flag2
    flag4 = flag1 or flag2
    flag5 = not flag1
    print("flag1 = ", flag1)
    print("flag2 = ", flag2)
    print("flag3 = ", flag3)
    print("flag4 = ", flag4)
    print("flag5 = ", flag5)
    print(flag1 is True)
    print(flag2 is not False)

    分支结构的应用场景

    迄今为止,我们写的Python代码都是一条一条语句顺序执行,这种结构的代码我们称之为顺序结构。然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的通关条件是玩家获得1000分,那么在完成本局游戏后我们要根据玩家得到分数来决定究竟是进入第二关还是告诉玩家“Game Over”,这里就会产生两个分支,而且这两个分支只有一个会被执行,这就是程序中分支结构。类似的场景还有很多,给大家一分钟的时间,你应该可以想到至少5个以上这样的例子,赶紧试一试。

    if语句的使用

    在Python中,要构造分支结构可以使用ifelifelse关键字。所谓关键字就是有特殊含义的单词,像ifelse就是专门用于构造分支结构的关键字,很显然你不能够使用它作为变量名(事实上,用作其他的标识符也是不可以)。下面的例子中演示了如何构造一个分支结构。

    """
    用户身份验证
    
    Version: 0.1
    Author: 骆昊
    """
    
    username = input('请输入用户名: ')
    password = input('请输入口令: ')
    # 如果希望输入口令时 终端中没有回显 可以使用getpass模块的getpass函数
    # import getpass
    # password = getpass.getpass('请输入口令: ')
    if username == 'admin' and password == '123456':
        print('身份验证成功!')
    else:
        print('身份验证失败!')

    唯一需要说明的是和C/C++、Java等语言不同,Python中没有用花括号来构造代码块而是使用了缩进的方式来设置代码的层次结构,如果if条件成立的情况下需要执行多条语句,只要保持多条语句具有相同的缩进就可以了,换句话说连续的代码如果又保持了相同的缩进那么它们属于同一个代码块,相当于是一个执行的整体。

    当然如果要构造出更多的分支,可以使用if…elif…else…结构,例如下面的分段函数求值。

    $$f(x)=egin{cases} 3x-5& ext{(x>1)}x+2& ext{(-1}leq ext{x}leq ext{1)}5x+3& ext {(x<-1)}end{cases}$$

    """
    分段函数求值
    
            3x - 5  (x > 1)
    f(x) =  x + 2   (-1 <= x <= 1)
            5x + 3  (x < -1)
    
    Version: 0.1
    Author: 骆昊
    """
    
    x = float(input('x = '))
    if x > 1:
        y = 3 * x - 5
    elif x >= -1:
        y = x + 2
    else:
        y = 5 * x + 3
    print('f(%.2f) = %.2f' % (x, y))

    当然根据实际开发的需要,分支结构是可以嵌套的,例如判断是否通关以后还要根据你获得的宝物或者道具的数量对你的表现给出等级(比如点亮两颗或三颗星星),那么我们就需要在if的内部构造出一个新的分支结构,同理elifelse中也可以再构造新的分支,我们称之为嵌套的分支结构,也就是说上面的代码也可以写成下面的样子。

    """
    分段函数求值
    		3x - 5	(x > 1)
    f(x) =	x + 2	(-1 <= x <= 1)
    		5x + 3	(x < -1)
    
    Version: 0.1
    Author: 骆昊
    """
    
    x = float(input('x = '))
    if x > 1:
        y = 3 * x - 5
    else:
        if x >= -1:
            y = x + 2
        else:
            y = 5 * x + 3
    print('f(%.2f) = %.2f' % (x, y))

    **说明:**大家可以自己感受一下这两种写法到底是哪一种更好。在之前我们提到的Python之禅中有这么一句话“Flat is better than nested.”,之所以提出这个观点是因为嵌套结构的嵌套层次多了之后会严重的影响代码的可读性,如果可以使用扁平化的结构就不要去用嵌套,因此之前的写法是更好的做法。

  • 相关阅读:
    Winform自定义窗体样式,实现标题栏可灵活自定义
    肿瘤转录组数分析CRN:Cancer RNA-Seq Nexus
    TCGA系列--miRNA数据分析
    TCGA系列--甲基化神器mexpress
    R:reshape2包中的melt
    TCGA系列--GDCRNATools
    R软件中排序:sort(),rank(),order()
    TCGA系列--TCGA长链非编码RNA的可视化工具TANRIC
    记一次RabbitMQ解决分布式事务问题
    RabbitMQ整合Spring Booot【死信队列】
  • 原文地址:https://www.cnblogs.com/why098/p/11311422.html
Copyright © 2011-2022 走看看