day-3变量与运算符

变量

  • 什么是变量
    变量是在程序中开辟空间存储数据用的
  • 怎么声明变量
    • 语法:
      变量名 = 值(必须赋值)
    • 说明:
      变量名 — 程序员自己命名:
      要求:是标识符,不能是关键字
      规范:遵守PEP8命名规范 - 变量名的所有字母都小写,并且单词
      之间都用下划线隔开
      见名知意:看见变量名大概知道变量中存储的什么数据
name = '小米'
num1 = num
print(num, name)

# 1.变量必须先声明/赋值在使用
# print(num3)    # NameError: name 'num3' is not defined

# 2.同时声明多个人变量。赋相同的值
a = b = c = 10
print(a, b, c)

# 3.同时声明多个变量,赋不同的值:变量名1,变量名2,... = 值1,值2,....
# 注意:变量名要和值的个数保持一致
name, age, sex = '小婷', 18, '女'
print(name, age, sex)
"""
4.声明变量和给变量的原理(重要:变量存储的是数据地址而不是数据本身)
    现在内存中开辟空间存储数据(内存空间的大小由数据的大小动态分配),然后再将保存数据的内存空间的地址赋给变量
    用一个变量给另一个变量赋值的时候,实际是将变量中的地址赋给新的变量
"""

num4 = 100
num5 = num4
print(type(num4))
print(hex(id(num4)))  # 获取在变量中内存的地址
num4 = 'asdadasda'
print(hex(id(num4)))
print(hex(id(num5)))

运算符

运算符:

数学运算符、比较运算符、逻辑运算符、位运算、赋值运算

  • 逻辑运算符:
    and(逻辑与运算),or(逻辑或运算),not(逻辑非)
    所有的逻辑运算符的运算对象是布尔,结果也是布尔

    • and:

      a.两个都为True,结果就是True。只要有一个是False,结果就是False
      True and True -> True
      True and False -> False
      False and True -> False
      False and False -> False

      b.什么时候用:当希望多个跳减肥同时满足的时候,就用and将多个条件连接and相当于生活中的并且

    • or

      a.运算规则:两个都为False才是False,只要有一个是True结果就是True
      True or True -> True
      True or False -> True
      False or True -> True
      False or False -> False
      b.什么时候用:当希望多个条件只要有一个满足的时候,就用or将多个条件连接。or相当于生活中的或者

    • not

      a.运算规则:True变False,False变True
      not True -> False
      not False -> True
      b.什么时候用:对每个条件进行否定

    • 短路操作

      逻辑与运算的短路操作:当逻辑与运算(and)的前面的表达式的值是False时候,程序不会去执行and后面的表达式
      逻辑或运算的短路操作:当逻辑或运算(or)的前面的表达式的值是True时候,程序不会去执行or后面的表达式

  • .赋值运算符:=、+=、-=、=、/=、//=、*=
    不管是什么样的赋值运算符,最终的操作都是给变量赋值;所以赋值运算符左边的都是变量

    • =:将右边的值赋给左边的变量

    • 复合的赋值运算符:先将赋值符号左边变量中的值取出来,然后进行指定的运算,最后将运算结果在重新赋给左边的变量

    • 注意:复合运算符的左边必须是已经赋值过的变量

用一个变量保存学生的绩点,一个变量保存学生的操评分;写一个条件来判断学生是否能拿奖学金
奖学金条件:绩点不低于3.5,操评分至少90分
grade = 4
score = 88
print('是否能拿奖学金', grade > 3.5 and score >= 90)

奖学金条件:绩点不低于3.5,或者,操评分至少90分
grade = 4
score = 88
print('是否能拿奖学金', grade >= 4 or score >= 90)

练习:

1)判断一个数能否被2或者5整除
import random
number = random.randint(1, 200)
print(number)
print(number % 2 == 0 or number % 5 == 0)
2)判断一个数同时被2和5整除
print(number % 2 == 0 and number % 5 == 0)
print(number % 10 == 0)
3)判断一个数是否是3或者7的倍数,并且这个数的末尾不是3
print((number % 3 == 0 or number % 7 == 0) and number % 10 != 3)
print((number % 21 == 0) and number % 10 != 3)
  • 位运算符
    位运算操作的是数字的补码的每一位;位运算因为是直接操作计算机存储空间的每一位,所以执行效率要比一般的运算高很多
    位运算:&(按位与运算),| (按位或运算),^(按位异或),~(按位取反),<<(左移),>>(右移)
    • &(按位与运算)
      数字1 & 数字2 -> 两个数字补码上相同位置的数,如果都是1结果就是1,如果有个0就是0
      1 & 1 -> 1
      1 & 0 -> 0
      0 & 0 -> 0

      print(2 & 3)
      """
      2: 00000010
      3: 00000011
      00000010 -> 2
      """
      print(-2 & -3)
      """
      -2: (原)10000010 -> (反)11111101 -> (补)11111110
      -3: (原)10000011 -> (反)11111100 -> (补)11111101
      (补)11111100 -> 11111011(反) -> 10000100(原) -> -4
      
    • |(按位或运算)
      数字1 | 数字2 -> 两个数字补码上相同位置的数,如果有1结果都是1,两个0就是0
      1 & 1 -> 1
      1 & 0 -> 1
      0 & 0 -> 0

      print(2 | 3)
      """
      2: 00000010
      3: 00000011
      00000011
      """
      
      print(-2 | -3)
      """
      -2: (原)10000010 -> (反)11111101 -> (补)11111110
      -3: (原)10000011 -> (反)11111100 -> (补)11111101
      11111111(补) -> 11111110(反) -> 10000001(原) -> -1
      """
      
    • ~(按位取反)
      ~数字 -> 将数字补码上每一位的值由0变成1,1变成0
      ~1 -> 0
      ~0 -> 1
      ~1101 -> 0010

      print(~10)
          """
          10原码: 00001010
          11110101(补) -> 11110100(反) -> 10001011(原) -> -11
          """
      print(~-3)
      """
      -3: (原)10000011 -> (反)11111100 -> (补)11111101
      00000010 -> 2
      """
      
    • ^按位异或)
      数字1 ^ 数字2 -> 两个数字补码上相同位置的数,相同为1,不同为0
      注意:一个数异或两次同一个数,结果就是这个数本身
      1 & 1 -> 0
      1 & 0 -> 1
      0 & 0 -> 1

      print(10 ^ 20)
      """
      10原码: 00001010
      20原码: 00010100
      00011110 -> 16+8+4+2 -> 30
      """
      print(-2 ^ -3)
      """
      -2: (原)10000010 -> (反)11111101 -> (补)11111110
      -3: (原)10000011 -> (反)11111100 -> (补)11111101
      00000011 -
      
    • <<(左移),>>(右移)
      数字 << 位数(n) -> 让数字的补码整体左移n位低位用0补充 ->数字 * (2N)
      数字 >> 位数(n) -> 让数字的补码整体右移你位,正数高位补哦0,负数高位补1 -> 数字 // (2
      N)

  • 应用:
    1.乘2的次方或者整除2的次方的操作(<<, >>)
    2.数字 & 1 == 0 -> 偶数 ; 数字 & 1 == 1 -> 奇数
    01101110 & 1 == 0 偶数
    10010111 & 1 == 1 奇数

你可能感兴趣的:(day-3变量与运算符)