Python全栈-magedu-2018-笔记2

时间:2023-03-09 19:08:41
Python全栈-magedu-2018-笔记2

第二章 - Python 基础语法

基本语法

  • 注释 —— # 标注的文本

  • 数字
    • 整数,不区分long和int
      • 进制0xa、0o10、0b10
      • bool,2个值True、False
    • 浮点数
      • 1.2、3.1415、-0.12,1.46e9等价于1.46*109
    • 复数,1+2j
  • 字符串
    • 使用 ' " 单双引号引用的字符的序列
    • '''和""" 单双三引号,可以跨行、可以在其中*的使用单双引号
    • 在字符串前面加上r或者R前缀,表示该字符串不做特殊的处理
  • 转义序列
    • \\ \t \r \n \' \"
    • 前缀r,把里面的所有字符当普通字符对待
  • 缩进
    • 未使用C等语言的花括号,而是采用缩进的方式表示层次关系
    • 约定使用4个空格缩进
  • 续行
    • 在行尾使用
    • 如果使用各种括号,认为括号内是一个整体,内部跨行不用
  • 标识符
    1. 一个名字,用来指代一个值
    2. 只能字母、下划线和数字
    3. 只能以字母或下划线开头
    4. 不能是python的关键字,例如def、class就不能作为标识符
    5. Python是大小写敏感的
  • 约定:
    • 不允许使用中文
    • 不允许使用歧义单词,例如class_
    • 在python中不要随便使用下划线开头的表示符
  • 常量
    • 一旦赋值就不能改变值的标识符
    • python中无法定义常量
  • 字面常量
    • 一个单独的量,例如 12、"abc" 、'2341356514.03e-9'
  • 变量
    • 赋值后,可以改变值的标识符

Python的语言类型

  • Python是动态语言、强类型语言

  • 静态编译语言
    • 实现声明变量类型,类型不能再改变
    • 编译时检查
  • 动态编译语言
    • 不用事先声明类型,随时可以赋值为其他类型
    • 编程时不知道是什么类型,很难推断
  • 强类型语言
    • 不同类型之间操作,必须先强制类型转换为同一类型。print('a'+1)
  • 弱类型语言
    • 不同类型间可以操作,自动隐式转换,JavaScript中console.log(1+'a')

运算符 Operator

  • 算数运算符
    • + - * / % **
    • 自然除/结果是浮点数,整除//。注:2.x中/和//都是整除
  • 位运算符
    • & | ~ ^ << >>
    • 常用方式:乘除2的倍数,32 // 4相当于 32 >> 2
    • 12,0xc,0o14,0b1100
      • ~12等于多少,为什么

原码、反码、补码,负数表示法

  • 原码
    • 5 => 0b101,1 => 0b1 ,-1 => -0b1, bin(-1)
  • 反码
    • 正数的反码与原码相同;负数的反码符号位不变其余按位取反
  • 补码
    • 正数的补码与原码相同;负数的补码符号位不变其余按位取反后+1
      有符号数才用补码表示
  • 负数表示法
    • 数字电路的CPU中的运算器实现了加法器,但是没有减法器,减法是转换成加法
    • 负数在计算机中使用补码存储,-1的补码为1111 1111
    • 5-1 => 5+(-1)直觉上是0b101-0b1,其实计算机中是0b101+0b11111111,溢出位舍弃
    • ~12为什么是-13?
    • 10^9 等于? 10^-9等于?为什么

     5 的补码 0000 0101
     -1 的原码 1000 0001
     -1 的补码 1111 1111 (0xff)
     5-1得 0000 0100

     12 的补码 0000 1100
     ~12 是 1111 0011
     怎么从补码得到原码?
     与得到补码是一样的,最高位不变,其他位取反加一,即补码的补码就是原码
     1000 1101 (即-13)

  • 比较运算符
    • == != > < >= <=
    • 返回一个bool值
    • 1 < '1'   报错       1 == '1'   False
    • == 是可以不同类型比较的,除非 大于、小于等做类型重载,不然是不能比较的
    • 链式比较操作符
      • 4>3>2       4>mynumber>=1
  • 逻辑运算符
    • 与或非 and or not
    • 短路运算符
      • and 如果第一个表达式为False,后面就没有必要计算了,这个逻辑表达式一定是False
      • or 如果第一个表达式True,后面没有必要计算了,这个逻辑表达式一定是True
  • 赋值运算符
    • a = min(3,5)
    • += -= *= /= %= 等
    • x = y = z = 10
      • 尽量少用连等,因为如果右边是个引用就麻烦了
  • 成员运算符
    • in、not in
  • 身份运算符
    • is 、is not

运算符优先级(由高到低)

运算符 描述
'expr' 字符串转换
{key:expr} 字典
[expr1, expr2, ...] 列表
(expr1, expr2, ...) 元组
function(expr, ...) 函数调用
x[index:index] 切片
x[index] 下标索引值
x.attribute 属性引用
~x 按位取反
+x, -x 正,负
x**y
x*y, x/y, x%y, 乘法,除,取模
x+y, x-y 加,减
x << y, x >> y 移位
x&y 按位与
x^y 按位异或
x|y 按位或
x<y, x<=y , x==y, x!=y, x>=y, x>y 比较
x is y , x is not y 等同测试
x in y, x not in y 成员测试
not x 逻辑否
x and y 逻辑与
x or y 逻辑或
lambda arg, ... : expr Lambda 匿名函数
  • 算数运算符 > 位运算符 > 身份运算符 > 成员运算符 > 逻辑运算符 > 赋值运算符
    • 位运算符也可以看成算术运算
  • 记不住,用括号

  • 长表达式,多用括号,易懂、易读

表达式 Expression

  • 由数字、符号、括号、变量等的组合
    • 算数表达式
    • 逻辑表达式
    • 赋值表达式
      • Python中,赋值即定义,如果一个变量已经定义,赋值相当于重新定义

内存管理

  • 变量无须事先声明,也不需要指定类型
    • 动态语言的特性
  • 编程中一般无须关心变量的存亡,也不用关心内存的管理

  • python使用引用计数记录所有对象的引用数
    • 当对象引用数变为0,它就可以被 垃圾回收GC
    • 计数增加:
      • 赋值给其它变量就增加引用计数,例如x=3;y=x
    • 计数减少:
      • 函数运行结束时,局部变量就会被自动销毁,对象引用计数减少
      • 变量被赋值给其它对象。例如x=3;y=x;x=4
  • 有关性能的时候,就需要考虑变量的引用问题,但是该释放内存,还是尽量不释放内存,看需求

程序控制

  • 顺序
    • 按照先后顺序一条条执行
    • 例如,先洗手,再吃饭,再洗碗
  • 分支
    • 根据不同的情况判断,条件满足执行某条件下的语句
    • 例如,先洗手,如果饭没有做好,玩游戏,如果饭做好了,就吃饭,如果饭都没有做,叫外卖
  • 循环
    • 条件满足就反复执行,不满足就不执行或不再执行
    • 例如,先洗手,看饭好了没有,没有好,一会来看一次是否好了,一会儿来看一次,直到饭好了,才可是吃饭。这里循环的条件是饭没有好,饭没有好,就循环的来看饭好了没有

单分支结构

  • if语句
    • if condition:
      • 代码块
    • condition必须是一个bool类型,这个地方有一个隐式转换bool(condition)
    • if 1<2:
          print('1 less than 2')
  • 代码块
    • 类似于if语句的冒号后面的就是一个语句块
    • 在if、for、def、class等

真值表

对象/常量
""
"string"
0
>=1
<=-1
()空元组
[]空列表
{}空字典
None
  • False等价布尔值,相当于bool(value)
    • 空集合
      • 空字符串
      • 空字典
      • 空列表
      • 空元祖
    • None对象
    • 0

多分支结构

  • if...elif...else语句
        if condition1:
            代码块1
        elif condition2:
            代码块2
        elif condition3:
            代码块3
        ......
        else:
            代码块

  • 举例
        a = 5
        if a<0:
            print('negative')
        elif a==0:
            print('zero')
        else:
            print('positive')

分支嵌套

  • 举例
        score = 80
         if score<0:
            print('wrong')
        else:
            if score==0:
                print('egg')
            elif score <= 100:
                print('right')
            else:
                print('too big')

  • 嵌套结构,可以是分支、循环的嵌套

  • 可以互相嵌套多层

  • 练习:给定一个不超过5位的正整数,判断其有几位
    • 使用 input 函数,input返回的是字符串
    • 如果位数多的话可以用折半
    • num = 8
      if (num /= 10) == 0:      为什么这里报错
          print('1位数')

循环——while语句

  • 语法
        while condition:
            block
    • 当条件满足即condition为True,进入循环体,执行block
  • 举例
        flag=10
        while flag:
            print(flag)
            flag -= 1
    • 执行结果是什么?为什么?
    • 如果flag=-10可以吗?如何改造?

循环——for语句*

  • 语法
    • for element in iteratable:
              block
    • 当可迭代对象中有元素可以迭代,进入循环体,执行block
  • range函数

  • 举例:打印1~10
        for i in range(10):
            print(i+1)
    • 执行结果是什么?为什么?
    • 如果想倒序打印呢

循环 continue语句

  • 中断当前循环的当次执行,继续下一次循环

  • 举例:计算10以内的偶数(for循环)
        for i in range(10):
            if not i%2:      # i%2==0这么写也行
                print(i)
  • 还有其它的实现吗?

    for i in range(0,10,2):
        print(i)

    for i in range(0,10):
        if i & 1:     # 或用 i%2 表示奇数就continue
            continue
        print(i)

循环 break语句

  • 终止当前循环
  • 举例:计算1000以内的被7整除的前20个数(for循环)
        count = 0
        for i in range(0,1000,7):
            print(i)
            count += 1
            if count >= 20:
                break

循环 continue、break语句

  • 总结
    • continue和break是循环的控制语句,只影响当前循环,包括while、for循环
    • 如果循环嵌套, continue和break也只影响语句所在的那一层循环
    • continue和break 不是跳出语句块,所以 if cond: break 不是跳出if,而是终止if外的break所在的循环
  • 练习:
    给定一个不超过5位的正整数,判断该数的位数,依次打印出个位、十位、百位、千位、万位的数字

循环 else子句

  • 语法
        while condition:
            block
        else:
            block
        for element in iteratable:
            block
        else:
            block

  • 如果循环正常的执行结束,就执行else子句;如果使用break终止,else子句不会执行

最后

本文的另外链接是:https://herodanny.github.io/python-magedu-2018-notes2.html