# --coding:utf-8--
# File: operator_test.py
# Author: dxj728
# Time: 2020年12月13日12时
# 说明：运算符学习
# 参考来源：https://www.runoob.com/python/python-operators.html


print('hello world')

'''运算符优先级：由高到低
可读性优先: 尽量保证表达式简单明了，不过多依赖以下优先级控制表达式，
    索引运算符：[]        \\eg: list[1]
    属性访问：.      \\eg: C.att
    乘方： **      \\eg: a**b
    按位取反：~          \\eg: ~a
    符号运算符：+ -       \\eg: -a
    算数运算符(乘除)：* / % //      \\eg: a*b
    算数运算符(加减)：+ -       \\eg: a+b
    位移运算符：>> <<     \\eg: a<<b
    按位与：&       \\eg: a & b
    按位异或：^      \\eg: a ^ b
    按位或：|       \\eg: a | b
    比较运算符：> >= < <=    \\eg: a>=b
    比较运算符(等于)：== !=    \\eg: a!=b
    赋值运算符：= %= /= //= -= += *= **=
    is运算符：is not is         \\eg: a is None
    成员运算符：in not in     \\eg: a in list
    逻辑运算符(非)：not
    逻辑运算符(与)：and
    逻辑运算符(或)：or
'''

'''赋值运算符：='''
# pi = 3.14       # 为变量pi赋值为3.14
# p = pi      # 将变量pi的值赋给p
# a = b = c = 20      # 赋值表达式亦是有值的(赋值表达式的值就是被赋的值)，将c=20这个表达式的值赋给b
# d = pi + 5      # 将表达式的值赋给变量

'''
    算术运算符：+  -  *  /  //  %  **
'''
# a = 5.2
# b = 3.1
#
# sum1 = a + b     # 加法运算符
# sum2 = 'hello' + ' world'    # 字符串或序列的连接运算符
#
# sub1 = a - b     # 减法运算符
# sub2 = -a       # 求负运算符, (但'+'不对操作数做任何改变)
# print(sub2)     # -5.2
#
# mul1 = a * b     # 乘法运算符
# mul2 = 'ha' * 2       # 字符串或序列的连接运算符
#
# div1 = a / b     # 除法运算符(0不能作为除数),除不尽时会产生小数部分
# print(div1)     # 1.6774193548387097
# div2 = a // b       # (python3)整除运算符(0不能作为除数), 运算结果只有整数部分，小数部分会被舍弃
# print(div2)     # 1.0
# print(type(div2))   # float
#
# rem = a % b     # 求余运算符(0不能作为除数)，参数不要求为整数，可以为浮点数，结果是第一个除以第二个结果数得到整除结果后剩下的值(可能是小数)
# print(rem)      # 2.1
#
# pow = a ** b        # 乘方运算符，亦可进行开方运算
# print(pow)      # 165.80986483300362
# print(27 ** (1/3))      # 3.0 灵活使用开方运算

'''
    位运算符：&  |  ^  ~  <<  >>
'''
# a = 5
# b = 9
#
# x1 = a & b       # 按位与
# print(x1)        # 1
#
# x2 = a | 9      # 按位或
# print(x2)       # 13
#
# x3 = ~a     # 按位取反; 即按照补码的值按位取反值(最高位也取反)
# print(x3)   # -6
# # 计算机存储：以补码的形式保存所有整数
# # 正数补码: 与原码相同
# # 负数补码： 原码(取反)——>反码(最高位不变), 反码+1得到补码
#
# x4 = a ^ b      # 异或运算; 按位取值，相同为0，不同为1
# print(x4)       # 12
#
# x5 = a << 2     # 左移运算符(补码操作，必须为整型); 将二进制码整体左移指定位数，空位补0，返回值有效
# print(x5)       # 20
#
# x6 = b >> 2     # 右移运算符(补码操作，必须为整数); 将二进制码整体右移指定位数，空位以最右位原符号位补充,即正数补0,负数补1，返回值有效
# print(x6)       # 2

'''
    比较运算符：>  >=  <  <=  ==  !=  is  is not, 返回值均为bool值，True(整数1), False(整数0)
'''
# print(5 > 4)    # True  \\大于
# print(5 >= 4)   # True  \\大于等于
# print(5 < 4)    # False \\小于
# print(5 <= 4)   # False \\小于等于
#
# print(5 == 5.0)     # True  \\等于
# print(1 != True)   # False  \\不等于


# print(1 is 1)   # True  \\判断变量引用对象是否相同(通过id()判断内存地址)，相同返回True
# print(1 is not 1)   # False \\\\判断变量引用对象是否不相同(通过id()判断内存地址)，不相同返回True
# 小整数对象池：一个python程序中，处于[-5, 256]区间内(包括-5和256)的整数及单个字母，称为小整数，在内存中是提前建立好的，否则不会被垃圾回收，\
#                  即所有该范围内使用都为同一个对象(有且仅有一个)；对象池满则新增一个对象池并加入维护序列
# 大整数对象池：console中每执行一次，大整数(除上述以外的整数)都会被重新创建; pycharm中是将所有代码都加载在内存中，属于一个整体, \
#                  即会有一个大整数对象池，处于同一代码块的大整数都是同一个对象，不同代码块的相同整数值不是同一对象
# 以下举例
# class C1(object):
#     a = 100
#     b = 1000
# class C2(object):
#     a = 100
#     b = 1000
# print(C1.a is C2.a)     # True  \\小整数对象池 效果
# print(C1.b is C2.b)     # False \\大整数对象池 效果

'''
    逻辑运算符：and  or  not
'''
# a = True
# b = False
#
# print(a and b)      # False     \\与，需要两个参数，两者都为True才返回True
# print(a or b)       # True      \\或，需要两个参数，两者只要有一个为True就返回True
# print(not b)        # True      \\非，只需要一个参数，对当前结果取bool反值
# # 编译优化会导致优先判断情况
# # and运算优化: 当参数1已判定False情况下，会忽略对参数2的判断，直接返回False
# # or运算优化: 当参数1已判定True情况下，会忽略对参数2的判断，直接返回True

'''
    成员运算符：in  not in
'''
# a = 'hello world!'
# print('e' in a)     # True      \\判断成员是否存在于于序列中
# print('e' not in a)     # False     \\判断成员是否不存在于序列中

'''
    一元/符号运算符：-  +(无意义)
'''
# a = 1.1
# b = -2
# print(-a)       # -1.1      \\取原值的负值
# print(+b)       # 1.1       \\取原值的正值(还是原值)，故无意义
