import enum
import sys

#文本注释
"""
    用作文本注释之后可以显示出来
    快捷键 ctrl /
    # 单行注释

#导入模块
import torch
#from <模块名(不用加.py后缀)> import <代码元素或者变量>
import class_test
from class_test import *  #导入全部的函数以及变量
#from <包名> import <代码元素>

#别名 as
import torch as t


#编程格式,空行分割逻辑代码块,缩进用于函数 tab键缩进 4个空格
#不要在分割符前加空格,分割符后面可以加空格
#断行,每行长度不应该过长,可以断行
bar = long_function_name(name1, name2,
                        name3, name4)

#数据类型:数字,字符串,列表,元组,集合,字典
数字:整数,浮点型,复数,布尔类型 True False
数字类型转换:隐式转换 a = 1 + True    a == 2
显式转换:
    int() 将变量转换为整数类型,浮点数、字符串转换为整数时小数部分会被截掉。  int('AB',16) 将字符转化为16进制的数字
    float()函数可以将布尔类型、整数和字符串转换为浮点类型
    bool()函数,将任何数据转换为布尔类型

字符串类型:(有顺序,也就是说可以通过索引进行访问,最坐标的索引为0.)
可以使用单引号或者双引号

使用python的print()函数可以将Unicode编码打印出来

#转义符: \t 水平制表符  \n 换行  \r 回车 \\反斜线
#在字符串前加 r 则表示原始字符,其中的全部转义符都会被译为普通符号

str = ‘{0} is {1} years old.’
字符串格式化 str.format(name,age)

占位符{} 控制符可以配合占位符使用
控制符s 字符串格式化  d十进制整数 f\F十进制浮点数 g\G 十进制整数或浮点数 e\E 科学计数法表示浮点数  o 八进制整数  x\X 十六进制整数
{1:d}表示字符为十进制整数  {1:5.2f} == 1234.56
字符串常用方法:
(返回查找字符串的索引,如果没有就返回-1) str.find(sub[, start[, end]) str.rfind(sub[, start[, end])
字符串长度len(str)
数字转化为字符串:‘3.24’ 或者str()  str(3.24)
"""

str1 = 'Hello Python!'
print(str1[0])    #输出结果为'h'

str1 = r'Hello Python!\r\n'
print(str1)

str1 = "计算结果:{0:5.2f}"
print(str1.format(1234.56))

str1 = "计算结果:{0:E}"
print(str1.format(12345))  #e+04 表示10的4次方

"""
二元运算符:+ - * / %取余 **幂 //地板除 求小于a/b商的最大值
不仅能够对数字,同样能够对字符串进行二元运算
关系运算符:== != > < >= <=
逻辑运算符:not and or
位运算符:& | ^异或 ~取反 >>右移 <<左移
其他运算符:同一性测试运算符 is is not 不等同于==,判断是否是同一对象  成员测试运算符 in not in判断某一序列中是否包含某个元素
is 判断两者对象是否一样,指的是其内存空间,内存地址等。 == 表示两者是否相等。
分片:[start:end] [start:end:step]
"""

str1 = 'hello' +' ' + 'world' + '!'
print(str1)

"""
控制语句:
if 条件: 语句
elif 条件2: 语句
else: 语句

三元运算符替代品: 表达式1 if 条件 else 表达式2

while 循环条件:
    语句组
[else:
    语句组]
只有正常结束后才会执行else语句,break 和 continue都会异常跳出循环,不执行else语句

for 迭代变量 in 序列:
    语句组
[else:
    语句组]
"""

#sys.argv[0] 显示该程序的绝对路径 sys.argv[1] 显示命令行传入的第一个参数 例如:python test one 将会显示one
path = sys.argv[0] #获取命令行传入的参数

if path:
    print(path)
else:
    print("路径为空!")

while path:
    print(path)
    break
else:
    print("正常结束while语句。")

for i in range(1, 10):   #只会显示到9
    print(i)

"""
数据结构:
元组 tuple 一种序列结构
序列:可迭代、元素有序、可重复出现的数据结构。 包括:字符串、元组、列表。
序列可以进行的操作由索引、分片、加和乘。(索引是由0开始的,-1表示最后一位)
分片:[start:end] [strat:end:step]
拆分:a1, a2, a3, a4 = a

列表:创建[],
列表可变,方法:append(x)追加单个元素, 使用+=可以追加多个元素 list += ['hello', 'world']
插入元素:insert(),在指定索引位置插入一个元素,insert(i,x) 在i处插入一个元素。
替换元素:list[2] = 'hello'
删除元素:remove() 和pop()。remove()从左到右查找列表中的元素,如果找到匹配元素则删除,如果找到多个只会删除第一个,如果没有找到则会抛出错误。
pop()删除元素,同时会将成功删除的元素返回。
其他常用方法:倒置,复制,清除,index()返回查找x第一次出现的索引,count返回x出现的次数

列表推导式:list = [x**2 for x in range(10) if x%2 == 0]
"""
#创建元组:
a = tuple([21, 32, 43, 54])
b = (21, 32, 43, 54)
c = ('hello', 'world', 1, 2, 3)
print(type(a), type(b), type(c))

#拆分
a1, a2, a3, a4 = a
a1, _, a3, _ = a    #可以选择不取哪些元素
a1, a2, *n = a     #*n 表示剩下部分作为列表赋值给n

for i in a:  #遍历元组
    print(i)

for i in enumerate(a): #enumerate函数可以获得元组对象,对象有两部分,索引和元素 (0 - 21)
    print(i)

list = ['hello', 'world', '!']
list.insert(0, 'well')
print(list)

list = [x**2 for x in range(10) if x%2 == 0]
print(list)

"""
集合:可迭代,无序,不能包含重复元素的数据结构,分为可变集合set和不可变集合frozenset.
创建可变集合:使用set([])
常用方法:添加,删除,清除
frozenset()函数,对于不可变集合如果对其修改就会报错。
集合推导式:集合中不能存在重复元素,因此集合推导式输出的结果会过滤掉重复的元素
"""
s = {'hello', 'world', '!'}
s = set(('hello', 'world', '!'))
print(s,type(s))

"""
字典:可迭代,可变的数据结果,通过键值来访问元素,而不是下标。包含两部分,键值(key)和值(value),键值不能包含重复元素,但是值可以,键值和键成对出现
创建字典:dict() 或 {‘102’:‘张三’} 键值不能是整数因此102会报错
修改字典:添加,替换,删除 要同时对键和值进行修改
del dict1[102](如果删除时键不存在则会报错) 或者 dict1.pop(109)(返回键值),dict1.popitem() 随机删除一个键值对,会返回键值对
遍历字典:使用keys()和values(),items()
k, v in dict.items()
k in dict.keys()
v in dict.values()
字典推导式:keys = [k for k, v in dict.items() if v%2 == 0]
"""
dict1 = dict(((102, '张三'), (105, '李四'), (109, '王五')))
dict1 = dict([(102, '张三'), (105, '李四'), (109, '王五')])
dict1 = dict(zip([102, 105, 109], ['张三', '李四', '王五']))
dict1 = {'102': '张三', '105': '李四', '109': '王五'}
print(dict1, type(dict1))
print("dict1.pop(109):" + dict1.pop('109'))

input_dict = {'0': 2, '1': 3, '2': 4}
keys = [k for k, v in input_dict.items() if v%2 == 0]
print(keys, type(keys))