python的基本语法知识

 第三天的学习内容喵,请大大们检查~

2.5运算符

分为一元、二元、三元运算符(python中没有三元)

一元是由一个数据参与运算,比如正负号 +78,-10,~19(按位取反)

二元是由两个数据参与运算,比如两个数据的加减

2.5.1算术运算符
加法 +
减法 -
乘法 *
除法 /  结果是浮点类型的  除不尽 商会有小数
    // 结果是整型的  对商进行向下取整 
        小于等于(<=)商且最接近于商的整数 称为向下取整
取余数 %  A除以B除不尽 会余下数据 这个余下的数据就是余数
    11除以3得3余2  这个2就是余数
    11 % 3 = 2
求幂数 **  比如x**y,求x的y次方 
    y如果是正整数N  对x求幂数次方
    y是1/N 小数格式  对x进行开方
    
    x = 2
    y = 3
    x ** y = 2的3次方 = 8
    
    x = 27
    y = 1/3
    x ** y = 27的三分之一次方 
    开方的时候结果是浮点型的  8**(1/2)

算术运算符的优先级别:** > -负号 > *、/、//、% > 加减

提高表达式的优先级使用小括号( )包含

eg:
print(-2 ** 2)  # -4,先运算了**,再在前面加负号
print((-2) ** 2)  # 4,括号()提高了优先级
2.5.2赋值运算符
简单赋值运算符
变量名 = 数据值
    将等号右边的表达式计算结果 赋值给左边的变量名
    
    比如 a = 17
    a = 19 % 4
    b = 18
    a = b // 4
复合赋值运算符
结合其他运算符在内的赋值格式,比如
变量名 += 表达式
-=
*=
/=
//=
%=
**=
​
先计算表达式的结果  在对变量名根据结果进行相应的算术运算,最后把计算结果赋值给变量名
​
比如 a = 17
a -= 18 % 4
​
1. 18 % 4 = 2
2. a - 2 = 17 - 2 = 15
3. a = 15
a = 17
a -= 18 % 4
print(a)  # 15
​
a += 2
print(a)  # 17
​
a %= 5   #  a % 5 = 2  ====> a = 2
print(a)  # 2
赋值表达式(海象运算符)

把某个赋值表达式的结果再赋值给另外一个变量,这种格式称为赋值表达式

比如在其他语言中 支持 y = (x = 17 % 3)

解读:先计算x的结果,再把x的值赋值给y

但是这个写法在Python中不支持,Python变更成 y = (x := 17 % 3)

这里其实也是同时定义了两个变量,只不过不同于a, b=11, 22的是这个赋值表达式在定义变量的时候,某个变量的值参与另外一个变量定义的运算

eg:
# 使用赋值表达式 写成一条语句
y = 2 * (x := int(input('请输入x的值:'))) + 5
print(y)
2.5.3比较运算符/关系运算符

对比两个表达式结果的关系的,运算符有:

>  判断前者是否大于后者
>= 判断前者是否大于或者等于后者
<  判断前者是否小于后者
<= 判断前者是否小于或者等于后者
== 判断两者是否相等,(一个等号赋值,两个等号判断是否相等)
!= 判断两者是否不相等

算术运算符级别高于比较运算符

字符串数据的比较,本质比较的是字符对应的十进制数据,比较规则相同位置的字符进行比较,直到比较出结果

eg:
s1 = 'hello'
s2 = 'head'
res = s1 > s2
第一次比较 h 对 h
第二次比较 e 对 e
第三次比较 l 对 a  成立
结束
结果为真

Practice

# 设定一个三位数 判断十位上的数据是否为偶数
decade = num//10%10
result = decade %2 == 0 # 除以2余数为0为偶数
print(result)
​
# 输入数判断能否被3整除
decade = int(input('数:'))
result1 = decade % 3 == 0
print(result1)
​
# 录入一个用户名判断是否为root用户
name = input('输入用户名')
result2 = name == 'root'
print(result2)
​
# 输入一个四位数,判断前两位之和是否等于后两位之和
num = int(input('四位数:'))
result3 = (num//1000 % 10 + num // 100 % 10) == (num//10 % 10 + num % 10)
print(result3)
​
# 输入一个三位数,判断从个位到百位上的数是否为步长为2的等差数
num1 = int(input('三位数:'))
result4 = num1 % 10 - num1//10 % 10 == num1//10 % 10 - num1//100 % 10
print(result4)
2.5.4逻辑运算符

逻辑运算符的优先级别是低于比较运算符的

逻辑运算符是来关联表达式的逻辑关系的,逻辑关系是有三种的

  1. 逻辑与(and)

    连接的逻辑关系是一个并且的关系,这两个表达式同时成立,结果才是成立的

    True and True = True
    True and False = False
    False and False = False
    False and True = False

    总结and的运行机制:

    and是具备有短路原则,左边表达式不成立,右边表达式不被执行

    eg:
    res = 10 > 5 and (x := 4) > 3
    print(res)  # True
    print(x)  # 4
    ​
    # and具备短路原则的: 左边不成立 右边不被执行
    res1 = 10 < 5 and (y := 7) > 3
    # print(res1, y)  # NameError: name 'y' is not defined
    左边不成立直接输出结果false终止运行,因此y并没有被赋值

    执行机制是左边表达式成立,结果取决于右边表达式;左边表达式不成立,结果就是左边表达式的值

  2. 逻辑或(or)

    连接的逻辑关系是或者的关系,两个表达式中有一个成立,结果就是成立的

    True or True = True
    True or False = True
    False or True = True
    False or False = False

    or也是具备短路原则的,左边表达式成立,右边不执行

    res2 = 10 > 5 or (z := 4) > 3
    print(res2)
    # print(z)  # NameError: name 'z' is not defined
    左边成立直接输出ture,右边的没有运行,

    执行机制:左边表达式成立,结果就是左边表达式的;左边表达式不成立,解决取决于右边表达式的值

  3. 逻辑非(not)

    对逻辑关系取反,逻辑关系结果为真,not之后设定为假;逻辑结果为假,not之后设定为真

    not True = False
    not False = True

优先级别的问题:

not > and > `or

eg:
# 键盘输入一个数据 判断其是否在1-100之间
num = int(input('请输入一个整数:'))
res = num >= 1 and num <= 100  # 如果这样写会有灰色的波浪线的提示 意思是:在Python中有简洁写法
# 对于连续范围的  支持数学中的表达方式 [本质和上面的写法是一样  两个关系之间是逻辑与的关系]
res = 1 <= num <= 100
print(res)
​
# 使用not来完成 
res4 = not(num < 1 or num > 100)
print(res4)
​
# not的优先级别高于or  先执行or要使用()包含
# res5 = not num < 1 or num > 100
# print(res5)
practice:
# 录入一个三位数,判断从个位上的数到百位上的数是否是步长为2的等差数
num1 = int(input('三位数:'))
result4 = num1 % 10 - num1//10 % 10 == num1//10 % 10 - num1//100 % 10 == 2
print(result4)
​
# 录入一个字符判断其是否为小写英文字母
num = ord(input('字母:'))  # 字符串可以比较大小
res = 97 <= num <= 122
print(res)
# 简化:
ch = input('请输入字符:')
res = 'a' <= ch <= 'z'
# 判断是否为汉字
res2 = ord(input('kanji:'))
res2 = '\u4e00' <= ch <= '\u9fa5'  # 直接写字也可以,开头是’一‘结尾是’龥‘
print(res2)
​
# 录入一个整数,判断其是否非同时是3和5的倍数
nu = int(input('number:'))
res1 = (nu % 5 == 0 or nu % 3 == 0) and not(nu % 5 == 0 and nu % 3 == 0)
print(res1)
# 简化
res1 = (nu % 5 == 0 or nu % 3 == 0) and not(nu % 15 == 0)
print(res1)
​
# 分别录入用户名和密码判断用户名是否为r00t密码是否为r00t123
name = input('输入用户名')
password = input('输入密码')
result2 = name == 'root' and password == 'root123'
print(result2)
2.5.5成员运算符

用来判定数据是某个容器型数据中的元素

数据 in 容器型数据
    把数据作为一个整体 判断是否在容器中
数据 not in 容器型数据
    把数据作为一个整体 判断是否不在容器中
eg:
s = 'hello, nice to meet you'
ch = 'l'
res = ch in s
print(res)  # True
​
ch1 = 'nice'
res1 = ch1 in s
print(res1)  # True
​
ch2 = 'too'
res2 = ch2 in s
print(res2)  # False

目前是字符串,之后还有列表、元组、字典、集合、range等等

2.5.6身份运算符

判定两个数据的地址在内存是否一致

数据1 is 数据2
    判断两个数据在内存中的地址是否是一致的
数据1 is not 数据2
    判断两个数据在内存中的地址是否是不一致的

启动程序,维护程序运行的数据存储于内存中,当程序结束,数据在内存中被释放了

将10赋值给a,(a顺着地址可以找到(10))

eg:
a = 10
print(a)
​
b = 10
print(b)
​
print(a is b)  # True
​
c = 20
print(a is c)
​
​
s1 = 'hello'
s2 = 'hello'
print(s1 is s2)
​
print(a is not c)  # True

内存也是分为不同的区域的,不同的区域存储的数据是不一样的,数据的生命周期也是不一样的,区域有:

  1. 栈区

  2. 堆区

  3. 常量池

    常量池中存储的是数值类型以及字符串类型的数据

    特点:获取数据时检查数据是否在常量池中存在,如果存在的话直接根据地址获取数据,如果不存在,先分配空间添加数据,再把数据的地址赋值给变量

    生命周期:当程序结束的时候才会释放

  4. 静态池

    存储全局变量【直接在py文件中定义的变量称为全局变量】

    生命周期:当程序结束的时候才会释放

  5. 方法区

2.5.7 位运算符

这个运算符的运算机制是对二进制数据进行运算的,因为是直接针对二进制运算,所以效率非常高。

& 按位与

相同位置的数据,只要有一个是0,该位置的结果为0

print(5 & 6)  # 4
"""
以一个字节为例  8位
0000 0101
0000 0110
---------
0000 0100 =====》 4
"""
​
print(5 & -7)  # 1
"""
5的补码: 0000 0101
-7的补码:
    7的原码: 0000 0111
    -7的原码:1000 0111
    -7的反码:1111 1000
    -7的补码:1111 1001
​
0000 0101
1111 1001
---------
0000 0001 ====》 1
"""

|按位或

相同位置的数据,只要有一个是1,该位置的结果为1

print(5 | -7)  # -3
"""
0000 0101
1111 1001
---------
1111 1101 【补码】  想要查看二进制对应的十进制数据是谁 需要看二进制的原码
    反码:1111 1100
    原码:1000 0011 =====》 -3
"""

^按位异或

相同位置的数据一样,该位置位0,否则为1【相同为0 不同为1】 一个数与相同的数异或两次结果是其本身 【可以用来:交换两个变量的值】

eg:
print(5 ^ -7)  # -4
""""  相同为0  不同为1
0000 0101
1111 1001
---------
1111 1100 【补码】
    反码: 1111 1011
    原码: 1000 0100 ====》 -4
"""
​
print(-4 ^ -7)  # 5
"""
1111 1100
1111 1001
---------
0000 0101 ====> 5
"""
practice
使用至少3种方法交换两个变量的值  a = 10  b = 20 ====> a = 20 b = 10
-- 方式1:大众的方式 借助第三方变量
          c = a
          a = b
          b = c
-- 方式2:采用异或 【不用第三方变量】
          a = a ^ b  # 10 ^ 20
          b = a ^ b  # 10 ^ 20 ^ 20  ====> 10
          a = a ^ b  # 10 ^ 20 ^ 10  ====> 20
-- 方式3:采用距离问题  【不采用第三方变量】
          a = a + b  # 10 + 20
          b = a - b  # 10 + 20 - 20 ====> 10
          a = a - b  # 10 + 20 - 10 ====> 20
-- 方式4:Python独有的方法
         a, b = b, a  ====> a, b = 20, 10

~按位取反

该位置上的数据0变1, 1变0

eg:
print(~ -7)  # 6
"""
1111 1001
---------
0000 0110 ====> 6
"""

>>按位右移

将二进制数据向右移动N位,左边空出的: 如果是正数 左边补0 如果是负数 左边补1 结果规律:数值//(2**N)

# 按位左移: 
practice:如何快速计算2的立方的值
print(1 << 3)  # 8
"""
0000 0001
左移3位  前面三个0舍去  后面补3个0
0000 1000
"""
​
print(2 << 3) # 16
"""
0000 0010
​
0001 0000 ===> 16
"""
​
print(2 << 4)  # 32
"""
"""
​
print(4 << 4)  # 64

<<按位左移

将二进制数据向左移动N位,右边空出补0 规律:数值*2**N

# 按位右移
print(16 >> 3)  # 2
"""
0001 0000
​
0000 0010  ====> 2
"""
​
print(-16 >> 3) # -2
"""
1001 0000 原
1110 1111 反
1111 0000 补
​
    1111 1110 【补码】
        反 1111 1101
        原 1000 0010  ===》 -2
"""
​
print(4 >> 3)  # 0 [会有等于0的情况]
"""
00000000
"""

运算符都是针对于位【二进制数据中一个0或者一个1称为一位】的

在计算机发展过程中,根据数据计算的发展的一个历程,二进制形态出现过三种:原码/反码/补码。补码运算正确率更高,现在的计算机中存储处理二进制数据的形态是补码。

对于正数来说,三码合一,格式是一样的, 原码样子就是将十进制数据按照规则转化为二进制的格式

负数的原码: 在正数的基础上将最高位置为1,则表示这个数据为负数。【二进制的最高位为符号位:0表示正数 1表示负数】,

之前接触过进制转换,数据大小不一样,获取的二进制数据中,位的个数不一样,怎么确定哪个是最高位???

【计算机中数据存储时开辟的最小单元是字节,1个字节是8位,位数一确定 最高位就确定了】,比如常规的数据开启的字节数是4个字节 32位

0000 0000 0000 0000 0000 0000 0000 0001

0000 0000 0000 0000 0000 0000 0000 1010 [10]

1000 0000 0000 0000 0000 0000 0000 1010 [-10]

负数的反码:在负数原码的基础上,除了符号位,0变1,1变0

-10的反码1111 1111 1111 1111 1111 1111 1111 0101

负数的补码: 在负数反码的基础上加1

-10的补码 1111 1111 1111 1111 1111 1111 1111 0110

补充:布尔类型参数算术或者位运算时 True被当做1,False被当做0

eg:
print(1 + True)
print(1000 * False)

2.6.1顺序结构语句

代码从上向下逐行运行的

2.6.2分支结构语句

分为三种格式的,这三种格式分别是

  1. 单分支 语法:

    if 条件表达式:
        满足条件执行的代码块

    语境:如果达到了某个条件,就去做某件事

    :缩进/冒号缩进:代表python中代码块的包含体,满足要求执行的代码要统一缩进体现出来的包含关系

    eg:
    # 再进行取余之前 需要先对数据进行判断  看一下是否要减去5
    num = int(input('请输入一个整数:'))
    if num % 2 == 0:
         num -= 5  # num = num - 5
    result = num % 3
    print(result)
  2. 双分支 语法

    if 条件表达式:
        满足条件执行的代码块
    else:
        不满足条件执行的代码块

    语境:如果满足某个条件做事情A,否则做事情B

    # 需求: 输入一个整数: 如果这个数是奇数 对数据进行 *7 - 9的运算 否则对数据进行 *5-11的运算
    num1 = int(input('请输入一个整数:'))
    if num1 % 2 != 0:
        result = num1 * 7 - 9
    else:
        result = num1 * 5 - 11
    print(result)
  3. 多分支 语法:

    if 条件表达式1:
        满足条件1执行的代码块
    elif 条件表达式2:
        不满足条件1 但是满足条件2执行的代码块
    elif 条件表达式3:
        满足条件3 但是不满足条件1和2执行的代码块
    ...
    else:
        以上条件都不满足执行的代码块

    语境:如果满足条件1,就做事情A,否则如果满足条件2,做事情B....

    # 需求:输入一个年龄 判断这个人是青年【年龄在30岁以下】  中年【30-60】  老年【60以上】
    age = int(input('请输入年龄:'))
    if age < 30:
        print('青年')
    elif age <= 60:
        print('中年')
    else:
        print('老年')

2.6.3循环结构语句

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值