#coding=utf-8   中文声明注释
# IPO编程方式  分别是:Input指的是输入、Process 指的是处理、Output指的是输出
'''
#输出函数 print
print('输出内容')
#print()函数完整的语法格式
#print(value,...,sep='',end='\n',file=None)
# sep 分割符, end 结束符 , file 把内容输出到文件当中
print('中国', end='--->')
print('|----------')
#输出 ASCII 码所对应的字符  chr 函数
print(chr(98))
#输出 字符对应的 ASCII 码  ord 函数
print(ord('b'))
#将内容输出到文件
fp=open('note.txt', 'w')  #打开文件 w--》write
print('北京欢迎您!', file=fp) #将 "北京欢迎您" 输出(写入)到note.txt文件中
fp.close() #关闭文件
#连接符 (+) 只能连接字符
print('中国'+'123')
#基本的输入函数 input
#inp =input('请输入数字:')
#得到的数字内容为字符串可以用 + 作为连接符连接
#print('得到数字:'+inp)
#inp=int(inp)
#转成整数类型不能再用 + 连接
#print('得到数字:', inp)
'''

# 单行注释用 # 号
'''
多行注释一
注释内容
123456
英文输入下
'''
"""
多行注释二
中文档注释,必需写在文档的第一行
例如: #coding=utf-8
"""

# 一般代码  不需要缩进
'''
示例:
print('hello')
print('world')
'''

# 类的定义 自动缩进
'''
示例:
class Student:
    pass

# 函数的定义  自动缩进
def fun():
    pass
'''


# 查看保留字 区分大小写
# 引入内置模块
import keyword
'''
示例:
# 打印保留字
print(keyword.kwlist)
# 打印保留字个数
print(len(keyword.kwlist))

# 变量的定义和使用
luck_number=8  # 创建一个整型变量luck_number,并为其赋值为8
my_name = '张三' # 字符串类型的变量

print('luck_number的数据类型是:',type(luck_number)) # <class 'int'>
print(my_name,'的幸运数字是:',luck_number)

# python 动态修改变量的数据类型,通过赋值就可以直接修改
luck_number='北京欢迎您'
print('luck_number的数据类型是:',type(luck_number)) # <class 'str'>
# 在Python中请允许多个变量指向同一个值
no=number=1024 # no与number都指向了1024这个整数值
print(no,number)
print(id(no)) # id() 查看对象的内存地址 2160086833648 地址不固定
print(id(number)) # 2160086833648

# 常量的定义
pi = 3.1415926 # 定义了一个变量
PI = 3.1415926 # 定义了一个常量 不可被修改

'''

# 数值类型  整数类型表示的数值是没有小数部分的数值,包含正整数、负整数和0
'''
进制种类    引导符号    描述
十进制       无        默认情况,例如:365,786
二进制     0b或OB      由字符0和1组成,例如0b10101,0B10101
八进制     0o或00      由字符0到7组成,例如0o763,00765
十六进制    0x或0X      由字符0到9,a到f或A到F组成,例如0x987A,0X987A
'''
'''

示例:
num=987         # 默认是十进制,表示整数
num2=0b1010101  # 使用二进制,表示整教
num3=0o765      # 使用八进制,表示整教
num4=0x87ABF    # 使用十六进制,表示整数
print(num)
print(num2)
print(num3)
print(num4)

'''


'''
浮点数类型 表示带有小数点的数值,由整数部分和小数部分组成
注意事项:两个浮点类型的数在进行运算时,有一定的概率运算
结果后增加一些“不确定的”尾数
Python中的复数与数学中的复数形式完全一致,由实部和虚部组成
        j=√-1
在Python中实数部分使用.real表示,虚数部分使用.imag表示
'''

'''
示例:
# 浮点数类型的使用
height = 188.3 # 身高
print(height)
print(type(height))  # 查看数据类型
x = 10
y = 10.0
print('x的数据类型:',type(x)) # <class 'int'>
print('y的数据类型:',type(y)) # <class 'float'>

x = 1.99E1413
print('科学计数法:',x,'x的数据类型:',type(x))
print(0.1+0.2) # 不确定的尾数问题 0.30000000000000004
print(round(0.1+0.2,1))  # 保留一位小数  结果:0.3

# 复数类型的使用
x = 123+456j
print('实数部分:',x.real)
print('虚数部分:',x.imag)
'''


'''
字符串类型
字符串类型连续的字符序列,可以表示计算机所能识别的一切字符
字符串的界定符:单引号、双引号、三引号
转义字符    描述说明
\n          换行符
\t          水平制表位,用于横向跳到下一个制表位
\"          双引号
\'          单引号
\\          一个反斜杠
'''

'''
示例:
city = '深圳市'
address = '深圳市白三石龙'
print(city)
print(address)

print('深圳\n欢迎您')
print('深圳\t欢迎您')
print('深圳欢迎\'您\'')
print("深圳\\欢迎\"您\"")

'''
"""
示例:
# 多选字符串
info = '''地址:深圳市宝安区
民治街道白石龙
一区186栋
'''
print(info)
"""

# 字符串的索引和切片
# 正向 0 致 9,逆向 -1 致 -10
'''
示例:
s = 'HELLOWORLD'
print(s[0],s[-10]) # 序号和序号-10表示的是同一个字符
print('深圳欢迎您'[4]) # 获取的是同一个字符
print('深圳欢迎您'[-1]) # 获取的是同一个字符
print(s[2:7]) # 从2开始到7结束不包含7 正向递增
print(s[-8:-3]) # 反向递减
print(s[:5]) # 默认N从0开始
print(s[5:]) # M 默认是切到字符串的结尾

xy = '2024年'
yx = '过年放炮,暴富一整年'
print(xy+yx) # 连接两个字符
print(xy*5) # 对xy这个字符串的内容复制5次
print(5*xy) # 效果和 xy*5 一样
isin = '2024' in xy
print(isin) # True  判断 2024 是否存在
print('2023' in xy) # False
'''

# 非0的整数布尔值都是True
# 所有非空的字符串布尔值都是True

'''
数据类型之间的转换
函数              描述说明
int(x)         将x转换为整数类型
float(x)       将x转换为浮点数类型
str(x)         将x转成字符串
chr(x)         将整数 x转换为一个字符
ord(x)         将一个字符x转换为其对应的整数值
hex(x)         将一个整数 x转换为一个十六进制字符串
oct(x)         将一个整数 x转换为一个八进制字符串
bin(x)         将一个整数 x转换为一个二进制字符串
'''
'''
示例:
x = 10
y = 3
z = x/y #在执行除法运算的时候,将运算的结果赋值给z
print(z,type(z)) #隐式转换,通过运算隐式的转了结果的类型

# float 类型转成int类型,只保留整数部分
print('float类型转成int类型:', int(3.14))
print('float类型转成int类型:', int(-3.14))
print('float类型转成int类型:', int(-3.9))

# 将int转成float类型
print('将int转成float类型:',float(10))
# 将str转成int类型
print(int('100')+int(10))
# 将字符串转成int或float时报错的情况
# print(int('18a')) #IndentationError: unexpected indent
# print(int('3.14')) #IndentationError: unexpected indent
# print(int('45a.987')) #IndentationError: unexpected indent

# chr() ord() 一对
print(ord('何')) # 将在unicode表中对应的整数值
print(chr(20309)) # 20309 整数在Unicode表中对应的字符是什么
# 进制之间的转换操作,十进制与其他进制之间的转换
print('十进制转成十六进制:', hex(20309))
print('十进制转成八进制:', oct(20309))
print('十进制转成二进制:', bin(20309))
'''


# eval 函数
'''
Python中的内置函数
用于去掉字符串最外侧的引号,并按照Python语句方式执行去掉引
号后的字符串
eval()函数经常和input()函数一起使用
eval的语法格式
    变量=eval(字符串)
'''
'''
s = '3.14+3'
print(s,type(s))
x = eval(s) # 使用eval函数去掉s这个字符串中左右的引号,执行加法运算
print(x,type(x))
# eval函数经常与input()函数一起使用,用来获取用户输入的数值
age = eval(input('请输入您的年龄:'))
print(age,type(age))
height = eval(input('请输入您的身高:'))
print(height,type(height))
hello = '深圳欢迎您'
print(hello)
print(eval('hello')) # 输入 "深圳欢迎您"  
# print(eval('深圳欢迎您'))  # NameError: name '深圳欢迎您' is not defined
'''

'''
        算术运算符:用于处理四则运算的符号

运算符     描述说明        示例          结果
+           加法          1+1           2
-           减法          1-1           0
*           乘法          2*3           6
/           除法          10/2          5.0
//          整除          10//3         3
%           取余          10%3          1
**          幂运算         2**4         16

'''

'''
示例:
print('加法:', 1+1)
print('减法:', 1-1)
print('乘法:', 2*3)
print('除法:', 10/2)
print('整除:', 10//2)
print('取余:', 10%3)
print('幂运算:', 2**5) # 2*2*2*2*2
print(10/0)  # 报错: ZeroDivisionError: division by zero
'''

'''
赋值运算符
算术运算符的优先级由高到低的是:
第一级:**
第二级:*、/、%、//
第三级:+、-

运算符                     描述说明                示例                  展开形式
=                        简单的赋值运算            x=y                    x=y
+=                       加赋值                  x+=y                   x=x+y
-=                       减赋值                  x-=y                   x=x-y
*=                       乘赋值                  x*=y                   x=x*y
/=                       除赋值                  x/=y                   x=x/y
%=                       取余赋值                 x%=y                  x=x%y
**=                      幂赋值                  x**=y                  x=x**y
//=                      整除赋值                x//=y                  x=x//y


示例:

x = 20 # 直接赋值,直接将20赋值给左侧的变量x
y = 10
x = x+y  # 将x+y的和赋值给x,x的值为30
print(x)    # x的值是30
x += y  # 40 相当于x=x+y
print(x)    # 40
x -= y  # 相当于x=x-y
print(x)    # 30
x *= y    # 300
print(x)
x /= y
print(x, type(x))    #30.0发生了类型转换 x的数据类型为float类型
x %= 2  # 相当于 x = x%2
print(x)    # 0.0
z=3
y //= z     # 相当于 y = y//z
print(y) # 3
y **= 2     # 相当于 y = y**2
print(y)    # 9

# python 支持链式赋值
a=b=c=100   # 相当于执行 a=100 b=100 c=100
print(a,b,c)

# Python 支持系列解包赋值
a,b=10,20   # 相当于执行了 a=10 b=20
print(a,b)

print('------------如何交换两个变量的值呢------------')
a,b = b,a   # 将b的值赋给a,将a的值赋给b
print(a,b)

'''


'''
比较运算符

运算符                 描述说明                示例                      展开形式
>                      大于                 98>90                      True
<                      小于                 98<90                      False
==                     等于                 98==90                     False
!=                     不等于               98!=90                      True
>=                     大于或等于            98>=98                      True
<=                     小于或等于            98<=98                      True

示例:
print('98大于90吗?', 98>90)
print('98小于90吗?', 98<90)
print('98等于90吗?', 98==90)
print('98不等于90吗?', 98!=90)
print('98大于等于98吗?', 98>=98)
print('98小于等于98吗?', 98<=98)

'''


'''
                            逻辑运算符

运算符             描述说明                用法                   结合方向
and                逻辑与            表达式1 and 表达式2          从左到右
or                 逻辑或            表达式1 or 表达式2           从左到右
not                逻辑非            not 表达式                  从右到左
示例:
print(True and True)
print(True and False)
print(False and False)
print(False and True)
print('-' * 40)
print(8>7 and 6>5)  # True
print(8>7 and 6<5)  # False
print(8<7 and 10/0)  # False,10/0并没有运算,当第一个表达式的结果为False,直接得结果,不会计算and右则的表达式了
print('-' * 40)
print(True or True)
print(True or False)
print(False or False)  # False
print(False or True)
print('-' * 40)
print(8>7 or 10/0)  # True,左则表达式结果为True时,or的右则表达式根本不执行运算符
print('-' * 40)
print( not True)  # False
print( not False)  # True
print( not 8>7)  # False

                位运算符
                
位运算符 把数字看作二进制数来进行计算的

    按“位与”运算(&)                         按“位或”运算(|)
    0000 0000 0000 1100                 0000 0000 0000 0100
&   0000 0000 0000 1000              |  0000 0000 0000 1000
————————————————————————————        ————————————————————————————
    0000 0000 0000 1000                 0000 0000 0000 1100
    
示例:
print('按位与运算:', 12&8)
print('按位或运算:', 4&8)
    
    
    按“位异或”运算 (^)                        按“位取反”运算 (~)
    0000 0000 0001 1111
^   0000 0000 0001 0110              ~  0000 0000 0111 1011
____________________________        _______________________________
    0000 0000 0000 1001                 1111 1111 1000 0100
示例:
print('按位异或运算:', 32^22)
print('按位取反:', ~123)

        位运算符
“左移位”运算 (<<)是将一个二进制数向左移动指定的位数,左边(高位端)溢出的位被丢弃,右边(低位端)的空位用0补充。

        |
        |0 0 0 0 0 0 1 0
        |
     0 0|0 0 0 0 1 0 0 0
     溢出|            左移后补0
     
示例:(左乘)
print('左移位:', 2<<2)  # 8,表示的是2向左移动两位 2*2*2
print('左移位:', 2<<3)  # 相当于2* 2*2*2

'右移位”运算 (>>)是将一个二进制数向右移动指定的位数,右边(低
位端)溢出的位被丢弃,左边(高位端)的空位端,如果最高位是0(正数)左
侧空位填0,如果最高位是1(负数),左侧空位填1。
        示图1:
        0 0 0 0 1 0 0 0|
                       |
        0 0 0 0 0 0 1 0|0 0
        左移后补0        |溢出
        示图2:
        1 0 0 0 1 0 0 0|
                       |
        1 1 1 0 0 0 1 0|0 0
        左移后补1        |溢出
        
示例:(右除)
print('右移位:', 8>>2)     # 8向右移动两位相当于 8//2,4//2
print('右移位:', -8>>2)    # -2


            运算符的优先级
    运算符                 描述说明
    **                    幂运算符
    ~、+、-               取反、正号、负号
    *、/、%、//            算术运算符
    +、-                  算术运算符
    <<、>>                位运算符中的左移位和右移位
    &                     位运算符中的按位与
    ^                     位运算符中的异域
    |                     位运算符中的按位或
<、<=、>、>=、!=、==        比较运算符
    =                     赋值运算符

操作示例:
# 通过计算取出对应的数
num = eval(input('请输入一个四位整数:'))
print('个位上的数:', num%10)
print('十位上的数:', num//10%10)
print('百位上的数:', num//100%10)
print('千位上的数:', num//1000%10)

# 字符串取出对应的数
num = input('请输入一个四位整数:')
print('个位上的数:', num[3])
print('十位上的数:', num[2])
print('百位上的数:', num[1])
print('千位上的数:', num[0])

'''