第一篇 python基础(一)
前期准备:
1 python安装
检查版本和链接:
检查模块是否安装
python -m django #-m mod : run library module as a script (terminates option list)
检查版本
python3 -V pip3 -V
注意:这里要强调一下: 系统自带的 Python2 和 Python3 不要删除,也不要替换!
# 若存在旧python3版本,备份旧版软链接 mv /usr/bin/python3 /usr/bin/python3.5 mv /usr/bin/pip3 /usr/bin/pip3.5 #添加python3的软链接 ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3 #添加 pip3 的软链接 ln -s /usr/local/python3/bin/pip3.7 /usr/bin/pip3
1.1 Windows安装:https://www.python.org/downloads/windows/
1.2 Linux安装:
centos7安装参考链接:https://juejin.cn/post/6880938269815603207
1.安装相应的编译工具 yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel yum install -y libffi-devel zlib1g-dev yum install zlib* -y 2.下载安装包 wget wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz 3.解压 tar -xvJf Python-3.7.2.tar.xz 4.创建编译安装目录 mkdir /usr/local/python3 5.安装 cd Python-3.7.2 ./configure --prefix=/usr/local/python3 --enable-optimizations --with-ssl #第一个指定安装的路径,不指定的话,安装过程中可能软件所需要的文件复制到其他不同目录,删除软件很不方便,复制软件也不方便. #第二个可以提高python10%-20%代码运行速度. #第三个是为了安装pip需要用到ssl,后面报错会有提到. make && make install 6.创建软链接 ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3 ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3 7.验证是否成功 python3 -V pip3 -V
cd ~ mkdir .pip cd .pip vim pip.conf #进入后添加以下内容,保存退出. [global] index-url = https://mirrors.aliyun.com/pypi/simple
ubuntu安装链接:https://zhuanlan.zhihu.com/p/149796622
注pip安装包(宿主环境):sudo python3.8 -m pip install trtpy
ubuntu16.04,安装 Python3.8.3 第1步:安装编译环境 #更新源的软件列表。 apt-get update apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-dev libffi-dev libc6-dev 第2步:下载 Python 源码 #去官方网站下载:(慢··) #wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz 阿里的镜像下载(速度快) wget https://cdn.npm.taobao.org/dist/python/3.8.3/Python-3.8.3.tgz 第3步:解压 tar -xzf Python-3.8.3.tgz 第4步:配置安装选项 #进入解压出来的 Python 源码文件夹: cd Python-3.8.3 #如果想快速安装,只配置安装位置即可。 #例如,我要把 Python3.8.3 安装在这个目录下:/usr/local/python3.8 ./configure --prefix=/usr/local/python3.8 # 注意:如果不在意安装耗时,可以设置优化选项--enable-optimizations ./configure --prefix=/usr/local/python3.8 --enable-optimizations 第5步:编译、安装 make && make install 第6步:设置软连接 ln -s /usr/local/python3.8/bin/python3.8 /usr/bin/python3.8 ln -s /usr/local/python3.8/bin/python3.8-config /usr/bin/python3.8-config #python3.8运行python: #执行pip python3.8 -m pip xxxxxx 注意:这里要强调一下: 系统自带的 Python2 和 Python3 不要删除,也不要替换! 系统自带的 Python2 和 Python3 不要删除,也不要替换! 系统自带的 Python2 和 Python3 不要删除,也不要替换! 第7步:PyPI源改为国内的镜像 #国内的 PyPI 镜像: 豆瓣 https://pypi.doubanio.com/simple/ 网易 https://mirrors.163.com/pypi/simple/ 阿里云 https://mirrors.aliyun.com/pypi/simple/ 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ #修改方法: 新建文件$HOME/.config/pip/pip.conf ,如果目录不存在,自己创建,文件内容如下: [global] index-url = https://mirrors.aliyun.com/pypi/simple/ [install] trusted-host = mirrors.aliyun.com
1.3 Conda安装(推荐):https://www.cnblogs.com/huahuawang/p/14813397.html#conda
2 Pycharn安装与使用
Pycharm安装:https://www.cnblogs.com/huahuawang/p/12659775.html
Pycharm激活:https://www.cnblogs.com/huahuawang/p/15098270.html
一 变量
1 ''' 2 3 一、什么是变量? 4 5 变量就是可以变化的量,量指的是事物的状态,比如人的年龄、性别,游戏角色的等级、金钱等等 6 7 二、为什么要有变量? 8 为了让计算机能够像人一样去记忆事物的某种状态,并且状态是可以发生变化的 9 详细地说: 10 程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来程 11 12 三、如何用变量 13 ''' 14 # 1、变量基本使用 15 # 原则:先定义,后引用 16 # name = 'egon' # 定义-》存 17 # print(name) # 引用-》取 18 19 # age = 18 20 # print(age) 21 22 # 2、内存管理:垃圾回收机制 23 # 垃圾:当一个变量值被绑定的变量名的个数为0时,该变量值无法被访问到,称之为垃圾 24 # 引用计数增加 25 x = 10 # 10的引用计数为1 26 y = x # 10的引用计数为2 27 z = x # 10的引用计数为3 28 29 # 引用计数减少 30 del x # 解除变量名x与值10的绑定关系,10的引用计数变为2 31 # print(y) 32 del y # 10的引用计数变为1 33 # print(z) 34 z = 12345 # # 10的引用计数变为0 35 # print(z) 36 37 # 3、变量有三大组成部分 38 # I:变量名=》是指向等号右侧值的内存地址的,用来访问等号右侧的值 39 # II:赋值符号:将变量值的内存地址绑定给变量名 40 # III:变量值:代表记录的事物的状态 41 42 # 4、变量名的命名的规则 43 # 原则:变量名的命名应该见名知意 44 # 4.1. 变量名只能是 字母、数字或下划线的任意组合 45 # 4.2. 变量名的第一个字符不能是数字 46 # 4.3. 关键字不能声明为变量名,常用关键字如下 47 # ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from','global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield'] 48 # age=18 49 # print='egon' 50 51 # ps:不要用拼音,不要用中文,在见名知意的前提下尽可能短 52 # mingzi='egon' 53 # 名字='egon' 54 # print(名字) 55 56 # 5、变量名的命名风格 57 # 5.1 纯小写加下划线的方式(在python中,关于变量名的命名推荐使用这种方式) 58 age_of_alex = 73 59 # print(age_of_alex) 60 # 5.2 驼峰体 61 AgeOfAlex = 73 62 # print(AgeOfAlex) 63 64 # 6、变量值三个重要的特征 65 # name='egon' 66 # id:反映的是变量值的内存地址,内存地址不同id则不同 67 # print(id(name)) 68 # type:不同类型的值用来表示记录不同的状态 69 # print(type(name)) 70 # value:值本身 71 # print(name) 72 73 # 6.2 is与== 74 # is:比较左右两个值身份id是否相等 75 # ==:比较左右两个值他们的值是否相等 76 ''' 77 id不同的情况下,值有可能相同,即两块不同的内存空间里可以存相同的值 78 id相同的情况下,值一定相同,x is y成立,x == y也必然成立 79 >>> 80 >>> x='info:Egon:18' 81 >>> y='info:Egon:18' 82 >>> print(x,y) 83 info:Egon:18 info:Egon:18 84 >>> print(id(x),id(y)) 85 4565819264 4566192176 86 >>> 87 >>> 88 >>> 89 >>> x == y 90 True 91 >>> x is y 92 False 93 ''' 94 95 # 了解:小整数池[-5,256] 96 # 从python解释器启动那一刻开始,就会在内存中事先申请 97 # 好一系列内存空间存放好常用的整数 98 ''' 99 >>> m=10 100 >>> n=10 101 >>> id(m) 102 4562619328 103 >>> id(n) 104 4562619328 105 >>> 106 >>> res=4+6 107 >>> res 108 10 109 >>> id(res) 110 4562619328 111 ''' 112 113 ''' 114 >>> x=-5 115 >>> y=-5 116 >>> x is y 117 True 118 >>> x=-6 119 >>> y=-6 120 >>> x is y 121 False 122 ''' 123 124 ''' 125 >>> x='aaa' 126 >>> y='aaa' 127 >>> 128 >>> 129 >>> id(x) 130 4566200880 131 >>> id(y) 132 4566200880 133 ''' 134 135 ''' 136 x=-6 137 y=-6 138 print(id(x)) 139 print(id(y)) 140 print(x is y) 141 ''' 142 143 # 7、常量:不变的量 144 # 注意:python语法中没有常量的概念,但是在程序的开发过程中会涉及到常量的概念 145 AGE_OF_ALEX = 73 # 小写字母全为大写代表常量,这只是一种约定、规范 146 AGE_OF_ALEX = 74 147 print(AGE_OF_ALEX)
二 基本数据类型
1 # 1、数字类型 2 # 1.1 整型int 3 # 作用:记录年龄、身份证号、个数等等 4 # 定义: 5 age = 18 6 # print(type(age)) 7 8 # 浮点型float 9 # 作用:记录薪资、身高、体重 10 # 定义 11 salary = 3.3 12 height = 1.87 13 weight = 70.3 14 # print(type(height)) 15 16 # 数字类型的其他使用 17 # level = 1 18 # level=level + 1 19 # print(level) 20 # print(10 *3) 21 22 # print(10 + 3.3) # int与float之间可以相加 23 # age = 19 24 # print(age > 18) 25 26 27 # 2、字符串类型str 28 # 作用:记录描述性质的状态,名字、一段话 29 # 定义:用引号('',"",''' ''',""" """,)包含的一串字符 30 info = ''' 31 天下只有两种人。比如一串葡萄到手,一种人挑最好的先吃, 32 另一种人把最好的留到最后吃。 33 照例第一种人应该乐观,因为他每吃一颗都是吃剩的葡萄里最好的; 34 第二种人应该悲观,因为他每吃一颗都是吃剩的葡萄里最坏的。 35 不过事实却适得其反,缘故是第二种人还有希望,第一种人只有回忆。 36 ''' 37 # print(type(info)) 38 # name="egon" 39 # print(name) 40 41 # x=18 42 # print(type(x)) 43 # x='18' # 由数字组成的字符串,是字符串类型,不是int类型 44 # print(type(x)) 45 46 # 'name'='egon' # 语法错误,等号左边是变量名,变量名的命名不能有引号 47 48 # xxx # 代表访问变量名字 49 'xxx' # 代表的是值 50 51 # x=10 52 # y=x 53 54 # 其他使用: 55 # 字符串的嵌套,注意:外层用单引号,内存应该用双引号,反之亦然 56 # print("my name is 'egon'") 57 # print('my name is \'egon\'') 58 59 # 字符串之间可以相加,但仅限于str与str之间进行, 60 # 代表字符串的拼接,了解即可,不推荐使用,因为str之间的 61 # 相加效率极低 62 # print('my name is '+'egon') 63 # print('='*20) 64 # print('hello world') 65 # print('='*20) 66 67 68 # 3、列表:索引对应值,索引从0开始,0代表第一个 69 # 作用:按位置记录多个值(同一个人的多个爱好、同一个班级的所有学校姓名、同一个人12个月的薪资),并且可以按照索引取指定位置的值 70 71 # 定义:在[]内用逗号分隔开多个任意类型的值,一个值称之为一个元素 72 # 0 1 2 3 4 73 l = [10, 3.1, 'aaa', ['bbb', 'ccc'], 'ddd'] 74 # print(l) 75 # print(l[1]) 76 # print(l[2]) 77 # print(l[3][1]) 78 79 # print(l[4]) 80 # print(l[-1]) 81 82 # hobbies='read music play' 83 # print(hobbies) 84 # hobbies = ['read', 'music', 'play'] 85 # print(hobbies[1]) 86 87 # 其他的用途: 88 # students_info=[ 89 # ['tony',18,['jack',]], 90 # ['jason',18,['play','sleep']] 91 # ] 92 # 取出第一个学生的第一个爱好 93 # print(students_info[0][2][0]) 94 95 96 # 4、 97 # 索引反映的是顺序、位置,对值没有描述性的功能 98 # 0 1 2 3 99 info=['egon',18,'male',19] 100 # print(type(info)) 101 # print(info[0]) 102 # print(info[1]) 103 # print(info[2]) 104 105 # 字典类型:key对应值,其中key通常为字符串类型,所以key对值可以有描述性的功能 106 # 作用:用来存多个值,每个值都有唯一一个key与其对应,key对值有描述性功能 107 # 定义:在{}内用逗号分开各多个key:value 108 # d={'a':1,'b':2} 109 # print(type(d)) 110 # print(d['a']) 111 112 # info={ 113 # "name":'egon', 114 # "age":18, 115 # "gender":'male', 116 # "salary":19 117 # } 118 # print(info["salary"]) 119 120 # 其他用途: 121 # students_info=[ 122 # 第1个信息, 123 # 第2个信息, 124 # 第3个信息, 125 # ] 126 127 students_info=[ 128 {"name":'egon1','age1':19,'gender':'male'}, 129 {"name":'egon2','age1':19,'gender':'male'}, 130 {"name":'egon3','age1':19,'gender':'male'}, 131 ] 132 133 print(students_info[1]['gender']) 134 135 136 # 5 布尔bool 137 # 6.1 作用 138 # 用来记录真假这两种状态 139 # 140 # 6.2 定义 141 # is_ok = True 142 # is_ok = False 143 # print(type(is_ok)) 144 145 # x=1 146 # y=0 147 148 # students=[ 149 # {'name':'egon','gender':'male'}, 150 # {'name':'alex','gender':'female'}, 151 # ] 152 153 # students=[ 154 # {'name':'egon','gender':True}, 155 # {'name':'alex','gender':False}, 156 # ] 157 158 students=[ 159 {'name':'egon','gender':1}, 160 {'name':'alex','gender':0}, 161 ] 162 163 # 6.3 其他使用 164 # 通常用来当作判断的条件,我们将在if判断中用到它 165 166 167 168 # 总结:如何选择合适的类型来记录状态 169 # 1、选取的类型是否可以明确标识事物的状态 170 # 2、存不是目的,存的目的是为了日后取出来用,并且方便的用 171 # 3、把自己想象成一台计算机,如果我是计算机, 172 # 我会如何以何种形式把事物的状态记到脑子里 173 # 然后再去python中找相应的数据类型来让计算机像自己一样去记下事物的状态
三 字符串格式化 & 运算符 & GC
from gooey import Gooey, GooeyParser import shutil import os def copy_files(satrt_num,end_number,source_file,target_dir): # target_dir =os.path.dirname(__file__) for i in range(satrt_num, end_number+1): file_name = "{:>05d}.txt".format(i) if target_dir=="default": target_dir = os.path.dirname(source_file) try: shutil.copy(source_file, fr"{target_dir}\{file_name}") except Exception as e: print("copy{:>05d}.txt失败,reason:".format(i), e) print("恭喜你,复制文件{:>05d}.txt-{:>05d}.txt成功!".format(satrt_num,end_number)) @Gooey(program_name="文件快速cp小工具",encoding='cp936') def main(): base_path = r"D:\rsrc\data\coal-project" parser = GooeyParser(description="文件cp小工具 - @HuaWang") parser.add_argument('start_num', help="开始序号,例如1", default=1) parser.add_argument('end_num', help="结束序号", default=1) parser.add_argument('source_file', help="文件路径", widget="FileChooser",default=base_path) parser.add_argument('target_dir', help="target目录,默认为file目录", widget="DirChooser",default ="default") args = parser.parse_args() #将用户输入的所有文本转化为对应对象的变量值,args.var 可提取对应的变量值 copy_files(int(args.start_num), int(args.end_num),args.source_file,args.target_dir) print("over!!!!!",flush=True) if __name__ == '__main__': main()
1 # 1、接收用户的输入 2 # 在Python3:input会将用户输入的所有内容都存成字符串类型 3 # username = input("请输入您的账号:") # "egon" 4 # print(username, type(username)) 5 6 # age = input("请输入的你的年龄: ") # age="18" 7 # print(age, type(age)) 8 # age=int(age) # int只能将纯数字的字符串转成整型 9 # print(age > 16) 10 11 # int("12345") 12 # int("1234.5") 13 # int("1234abc5") 14 15 16 # 在python2中: 17 # raw_input():用法与python3的input一模一样 18 # input(): 要求用户必须输入一个明确的数据类型,输入的是什么类型,就存成什么类型 19 # >>> age=input(">>>>>>>>>>>>>>>>>>>>>: ") 20 # >>>>>>>>>>>>>>>>>>>>>: 18 21 # >>> age,type(age) 22 # (18, <type 'int'>) 23 # >>> 24 # >>> x=input(">>>>>>>>>>>>>>>>>>>>>: ") 25 # >>>>>>>>>>>>>>>>>>>>>: 1.3 26 # >>> x,type(x) 27 # (1.3, <type 'float'>) 28 # >>> 29 # >>> x=input(">>>>>>>>>>>>>>>>>>>>>: ") 30 # >>>>>>>>>>>>>>>>>>>>>: [1,2,3] 31 # >>> x,type(x) 32 # ([1, 2, 3], <type 'list'>) 33 # >>> 34 35 36 # 2。字符串的格式化输出 37 # 2.1 % 38 # 值按照位置与%s一一对应,少一个不行,多一个也不行 39 # res="my name is %s my age is %s" %('egon',"18") 40 # res="my name is %s my age is %s" %("18",'egon') 41 # res="my name is %s" %"egon" 42 # print(res) 43 44 # 以字典的形式传值,打破位置的限制 45 # res="我的名字是 %(name)s 我的年龄是 %(age)s" %{"age":"18","name":'egon'} 46 # print(res) 47 48 # %s可以接收任意类型 49 # print('my age is %s' %18) 50 # print('my age is %s' %[1,23]) 51 # print('my age is %s' %{'a':333}) 52 # print('my age is %d' %18) # %d只能接收int 53 # print('my age is %d' %"18") 54 55 # 2.2 str.format:兼容性好 56 # 按照位置传值 57 # res='我的名字是 {} 我的年龄是 {}'.format('egon',18) 58 # print(res) 59 60 # res='我的名字是 {0}{0}{0} 我的年龄是 {1}{1}'.format('egon',18) 61 # print(res) 62 63 # 打破位置的限制,按照key=value传值 64 # res="我的名字是 {name} 我的年龄是 {age}".format(age=18,name='egon') 65 # print(res) 66 67 # 了解知识 68 """ 69 2.4 填充与格式化 70 # 先取到值,然后在冒号后设定填充格式:[填充字符][对齐方式][宽度] 71 # *<10:左对齐,总共10个字符,不够的用*号填充 72 print('{0:*<10}'.format('开始执行')) # 开始执行****** 73 74 # *>10:右对齐,总共10个字符,不够的用*号填充 75 print('{0:*>10}'.format('开始执行')) # ******开始执行 76 77 # *^10:居中显示,总共10个字符,不够的用*号填充 78 print('{0:*^10}'.format('开始执行')) # ***开始执行*** 79 2.5 精度与进制 80 81 print('{salary:.3f}'.format(salary=1232132.12351)) #精确到小数点后3位,四舍五入,结果为:1232132.124 82 print('{0:b}'.format(123)) # 转成二进制,结果为:1111011 83 print('{0:o}'.format(9)) # 转成八进制,结果为:11 84 print('{0:x}'.format(15)) # 转成十六进制,结果为:f 85 print('{0:,}'.format(99812939393931)) # 千分位格式化,结果为:99,812,939,393,931 86 87 """ 88 89 # 2.3 f:python3.5以后才推出 90 x = input('your name: ') 91 y = input('your age: ') 92 res = f'我的名字是{x} 我的年龄是{y}' 93 print(res)
1 # 1、算数运算符 2 # print(10 + 3.1) 3 # print(10 + 3) 4 # print(10 / 3) # 结果带小数 5 # print(10 // 3) # 只保留整数部分 6 # print(10 % 3) # 取模、取余数 7 # print(10 ** 3) # 取模、取余数 8 9 # 2、比较运算符: >、>=、<、<=、==、!= 10 # print(10 > 3) 11 # print(10 == 10) 12 # 13 # print(10 >= 10) 14 # print(10 >= 3) 15 16 # name=input('your name: ') 17 # print(name == 'egon') 18 19 20 # 3、赋值运算符 21 # 3.1 =:变量的赋值 22 # 3.2 增量赋值: 23 # age = 18 24 # # age += 1 # age=age + 1 25 # # print(age) 26 # 27 # age*=3 28 # age/=3 29 # age%=3 30 # age**=3 # age=age**3 31 32 # 3.3 链式赋值 33 # x=10 34 # y=x 35 # z=y 36 # z = y = x = 10 # 链式赋值 37 # print(x, y, z) 38 # print(id(x), id(y), id(z)) 39 40 # 3.4 交叉赋值 41 m=10 42 n=20 43 # print(m,n) 44 # 交换值 45 # temp=m 46 # m=n 47 # n=temp 48 # print(m,n) 49 50 # m,n=n,m # 交叉赋值 51 # print(m,n) 52 53 # 3.5 解压赋值 54 salaries=[111,222,333,444,555] 55 # 把五个月的工资取出来分别赋值给不同的变量名 56 # mon0=salaries[0] 57 # mon1=salaries[1] 58 # mon2=salaries[2] 59 # mon3=salaries[3] 60 # mon4=salaries[4] 61 62 # 解压赋值 63 # mon0,mon1,mon2,mon3,mon4=salaries 64 # print(mon0) 65 # print(mon1) 66 # print(mon2) 67 # print(mon3) 68 # print(mon4) 69 70 # mon0,mon1,mon2,mon3=salaries # 对应的变量名少一个不行 71 # mon0,mon1,mon2,mon3,mon4,mon5=salaries # 对应的变量名多一个也不行 72 73 # 引入*,可以帮助我们取两头的值,无法取中间的值 74 # 取前三个值 75 # x,y,z,*_=salaries=[111,222,333,444,555] # *会将没有对应关系的值存成列表然后赋值给紧跟其后的那个变量名,此处为_ 76 # print(x,y,z) 77 # print(_) 78 79 # 取后三个值 80 # *_,x,y,z=salaries=[111,222,333,444,555] 81 # print(x,y,z) 82 83 # x,*_,y,z=salaries=[111,222,333,444,555] 84 # print(x,y,z) 85 86 # salaries=[111,222,333,444,555] 87 # _,*middle,_=salaries 88 # print(middle) 89 90 # 解压字典默认解压出来的是字典的key 91 x,y,z=dic={'a':1,'b':2,'c':3} 92 print(x,y,z)
1 # 垃圾回收机制详解(了解) 2 3 # 1、引用计数 4 # x = 10 # 直接引用 5 # print(id(x)) 6 # y = x 7 # z = x 8 # 9 # l = ['a', 'b', x] # 间接引用 10 # print(id(l[2])) # 11 # 12 # d = {'mmm': x} # 间接引用 13 # 14 # print(id(d['mmm'])) 15 16 17 # x=10 18 # l=['a','b',x] # l=['a'的内存地址,'b'的内存地址,10的内存地址] 19 # 20 # x=123 21 # print(l[2]) 22 # 23 # 24 # x=10 25 # x=[10,] 26 # 27 # l=['a','b',10] 28 29 30 # 2、标记清除:用来解决循环引用带来的内存泄露问题 31 # 循环引用=>导致内存泄露 32 l1=[111,] 33 l2=[222,] 34 35 l1.append(l2) # l1=[值111的内存地址,l2列表的内存地址] 36 l2.append(l1) # l2=[值222的内存地址,l1列表的内存地址] 37 38 # print(id(l1[1])) 39 # print(id(l2)) 40 41 # print(id(l2[1])) 42 # print(id(l1)) 43 44 # print(l2) 45 # print(l1[1]) 46 47 del l1 48 del l2 49 50 # 3、分代回收:用来降低引用计数的扫描频率,提升垃圾回收的效率
四 逻辑运算&流程控制
1 # 1、可变不可变类型 2 3 # 可变类型:值改变,id不变,证明改的是原值,证明原值是可以被改变的 4 # 不可变类型:值改变,id也变了,证明是产生新的值,压根没有改变原值,证明原值是不可以被修改的 5 6 # 2、验证 7 # 2.1 int是不可变类型 8 # x=10 9 # print(id(x)) 10 # x=11 # 产生新值 11 # print(id(x)) 12 13 # 2.2 float是不可变类型 14 # x=3.1 15 # print(id(x)) 16 # x=3.2 17 # print(id(x)) 18 19 # 2.3 str是不可变类型 20 # x="abc" 21 # print(id(x)) 22 # x='gggg' 23 # print(id(x)) 24 25 # 小结:int、float、str都被设计成了不可分割的整体,不能够被改变 26 27 28 # 2.4 list是可变类型 29 # l=['aaa','bbb','ccc'] 30 # print(id(l)) 31 # l[0]='AAA' 32 # print(l) 33 # print(id(l)) 34 35 # 2.5 dict 36 # dic={'k1':111,'k2':222} 37 # print(id(dic)) 38 # dic['k1']=3333333333 39 # # print(dic) 40 # print(id(dic)) 41 42 43 #2.6 bool不可变 44 45 46 # 关于字典补充: 47 # 定义:{}内用逗号分隔开多key:value, 48 # 其中value可以是任意类型 49 # 但是key必须是不可变类型 50 51 # dic={ 52 # 'k1':111, 53 # 'k2':3.1, 54 # 'k3':[333,], 55 # 'k4':{'name':'egon'} 56 # } 57 # 58 # dic={ 59 # 2222:111, 60 # 3.3:3.1, 61 # 'k3':[333,], 62 # 'k4':{'name':'egon'} 63 # } 64 # print(dic[3.3]) 65 66 # dic={[1,2,3]:33333333} 67 # dic={{'a':1}:33333333}
1 # 2、什么是条件?什么可以当做条件?为何要要用条件? 2 # 第一大类:显式布尔值 3 # 2.1 条件可以是:比较运算符 4 # age = 18 5 # print(age > 16) # 条件判断之后会得到一个布尔值 6 7 # 2.1 条件可以是:True、False 8 # is_beautiful=True 9 # print(is_beautiful) 10 11 12 # 第二大类:隐式布尔值,所有的值都可以当成条件去用 13 # 其中0、None、空(空字符串、空列表、空字典)=》代表的布尔值为False,其余都为真
1 # 一:not、and、or的基本使用 2 # not:就是把紧跟其后的那个条件结果取反 3 # ps:not与紧跟其后的那个条件是一个不可分割的整体 4 # print(not 16 > 13) 5 # print(not True) 6 # print(not False) 7 # print(not 10) 8 # print(not 0) 9 # print(not None) 10 # print(not '') 11 12 # and:逻辑与,and用来链接左右两个条件,两个条件同时为True,最终结果才为真 13 # print(True and 10 > 3) 14 15 # print(True and 10 > 3 and 10 and 0) # 条件全为真,最终结果才为True 16 # print( 10 > 3 and 10 and 0 and 1 > 3 and 4 == 4 and 3 != 3) # 偷懒原则 17 18 # or:逻辑或,or用来链接左右两个条件,两个条件但凡有一个为True,最终结果就为True, 19 # 两个条件都为False的情况下,最终结果才为False 20 # print(3 > 2 or 0) 21 # print(3 > 4 or False or 3 != 2 or 3 > 2 or True) # 偷懒原则 22 23 # 二:优先级not>and>or 24 # ps: 25 # 如果单独就只是一串and链接,或者说单独就只是一串or链接,按照从左到右的顺讯依次运算即可(偷懒原则) 26 # 如果是混用,则需要考虑优先级了 27 28 # res=3>4 and not 4>3 or 1==3 and 'x' == 'x' or 3 >3 29 # print(res) 30 # 31 # # False False False 32 # res=(3>4 and (not 4>3)) or (1==3 and 'x' == 'x') or 3 >3 33 # print(res) 34 35 36 37 res=3>4 and ((not 4>3) or 1==3) and ('x' == 'x' or 3 >3) 38 print(res)
1 # 1、成员运算符 2 # print("egon" in "hello egon") # 判断一个字符串是否存在于一个大字符串中 3 # print("e" in "hello egon") # 判断一个字符串是否存在于一个大字符串中 4 5 # print(111 in [111,222,33]) # 判断元素是否存在于列表 6 7 # 判断key是否存在于字典 8 # print(111 in {"k1":111,'k2':222}) 9 # print("k1" in {"k1":111,'k2':222}) 10 11 # not in 12 # print("egon" not in "hello egon") # 推荐使用 13 # print(not "egon" in "hello egon") # 逻辑同上,但语义不明确,不推荐 14 15 # 2、身份运算符 16 # is # 判断的是id是否相等
1 # print(1) 2 # print(2) 3 # print(3) 4 # if 条件: 5 # 代码1 6 # 代码2 7 # 代码3 8 # print(4) 9 # print(5) 10 ''' 11 语法1: 12 if 条件: 13 代码1 14 代码2 15 代码3 16 17 ''' 18 # age = 60 19 # is_beautiful = True 20 # star = '水平座' 21 # 22 # if age > 16 and age < 20 and is_beautiful and star == '水平座': 23 # print('我喜欢,我们在一起吧。。。') 24 # 25 # print('其他代码.............') 26 27 28 ''' 29 语法2: 30 if 条件: 31 代码1 32 代码2 33 代码3 34 else: 35 代码1 36 代码2 37 代码3 38 ''' 39 40 # age = 60 41 # is_beautiful = True 42 # star = '水平座' 43 # 44 # if age > 16 and age < 20 and is_beautiful and star == '水平座': 45 # print('我喜欢,我们在一起吧。。。') 46 # else: 47 # print('阿姨好,我逗你玩呢,深藏功与名') 48 # 49 # print('其他代码.............') 50 51 52 ''' 53 语法3: 54 if 条件1: 55 代码1 56 代码2 57 代码3 58 elif 条件2: 59 代码1 60 代码2 61 代码3 62 elif 条件2: 63 代码1 64 代码2 65 代码3 66 ''' 67 # score=73 68 # if score >= 90: 69 # print('优秀') 70 # elif score >= 80 and score < 90: 71 # print('良好') 72 # elif score >= 70 and score < 80: 73 # print('普通') 74 75 # 改进 76 # score = input('请输入您的成绩:') # score="18" 77 # score=int(score) 78 # 79 # if score >= 90: 80 # print('优秀') 81 # elif score >= 80: 82 # print('良好') 83 # elif score >= 70: 84 # print('普通') 85 86 87 ''' 88 语法3: 89 if 条件1: 90 代码1 91 代码2 92 代码3 93 elif 条件2: 94 代码1 95 代码2 96 代码3 97 elif 条件2: 98 代码1 99 代码2 100 代码3 101 ... 102 else: 103 代码1 104 代码2 105 代码3 106 ''' 107 # score = input('请输入您的成绩:') # score="18" 108 # score=int(score) 109 # 110 # if score >= 90: 111 # print('优秀') 112 # elif score >= 80: 113 # print('良好') 114 # elif score >= 70: 115 # print('普通') 116 # else: 117 # print('很差,小垃圾') 118 # 119 # print('=====>') 120 121 122 ''' 123 if嵌套if 124 ''' 125 age = 17 126 is_beautiful = True 127 star = '水平座' 128 129 if 16 < age < 20 and is_beautiful and star == '水平座': 130 print('开始表白。。。。。') 131 is_successful = True 132 if is_successful: 133 print('两个从此过上没羞没臊的生活。。。') 134 else: 135 print('阿姨好,我逗你玩呢,深藏功与名') 136 137 print('其他代码.............')
1 # l=[111,222,333] 2 # l2=l # 把l的内存地址给l2 3 # 4 # 5 # l[0]='balabla' 6 # print(l) 7 # 8 # print(l2) 9 # 10 # l2[1]=4444444444444 11 # print(l2) 12 # print(l) 13 # 14 # 15 # del l2 16 17 # 格式化输出 18 # print('my name is %s age is %s' %('egon',18)) 19 # print('成功的概率 %s%% ' % (97,)) 20 21 # """ 22 # name:{} 23 # age:{} 24 # sex:{} 25 # """.format('egon',18,'male') 26 27 # """ 28 # name:{x} 29 # age:{y} 30 # sex:{z} 31 # """.format(z='male',x='egon',y=18) 32 33 # format新增(了解): 34 # print('{x}=============='.format(x='开始执行')) # 开始执行****** 35 # print('{x:=<10}'.format(x='开始执行')) # 开始执行****** 36 # print('{x:=>10}'.format(x='开始执行')) # 开始执行****** 37 # print('{x:=^10}'.format(x='开始执行')) # 开始执行****** 38 39 # 四舍五入 40 # print('{salary:.3f}'.format(salary=1232132.12351)) #精确到小数点后3位,四舍五入,结果为:1232132.124 41 42 43 # x='egon' 44 # y=18 45 # res=f'name:{x} age {y}' 46 # print(res) 47 48 # 49 # x='egon' 50 # y=18 51 # res=f'name:{{{x}}} age {y}' 52 # print(res) 53 54 # 了解f的新用法:{}内的字符串可以被当做表达式运行 55 # res=f'{10+3}' 56 # print(res) 57 58 # f'{print("aaaa")}'
五 深浅copy&while
1 list1=[ 2 'egon', 3 'lxx', 4 [1,2] 5 ] 6 7 # 1、二者分隔不开,list改list2也跟着该,因为指向的就是同一个地址 8 # list2=list1 # 这不叫copy 9 # list1[0]='EGON' 10 # print(list2) 11 12 # 2、需求: 13 # 1、拷贝一下原列表产生一个新的列表 14 # 2、想让两个列表完全独立开,并且针对的是改操作的独立而不是读操作 15 16 17 # 3、如何copy列表 18 # 3.1 浅copy:是把原列表第一层的内存地址不加区分完全copy一份给新列表 19 list1=[ 20 'egon', 21 'lxx', 22 [1,2] 23 ] 24 25 list3=list1.copy() 26 # print(list3) 27 # print(id(list1)) 28 # print(id(list3)) 29 30 # print(id(list1[0]),id(list1[1]),id(list1[2])) 31 # print(id(list3[0]),id(list3[1]),id(list3[2])) 32 33 # 实验1:对于不可变类型的赋值,都是产生了新值,让原列表的索引指向新的 34 # 内存地址,并不会影响新列表 35 list1[0]='EGON' 36 list1[1]='LXX' 37 # list1[2]=123 38 39 # 实验2:但对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变 40 # 即原列表的索引指向仍然指向原来的内存地址,于是新列表也跟着一起受 41 # 影响,如下 42 # list1[2][0]=111 43 # list1[2][1]=222 44 # print(list1) 45 # print(list3) 46 47 # 综合实验1和实验2可以得出,要想copy得到的新列表与原列表的改操作完全独立开 48 # 必须有一种可以区分开可变类型与不可变类型的copy机制,这就是深copy 49 50 # 3.2 深copy 51 import copy 52 list1=[ 53 'egon', 54 'lxx', 55 [1,2] 56 ] 57 58 list3=copy.deepcopy(list1) 59 # print(id(list1)) 60 # print(id(list3)) 61 # print(list3) 62 63 # 不可变 不可变 可变 64 # print(id(list1[0]),id(list1[1]),id(list1[2])) 65 # print(id(list3[0]),id(list3[1]),id(list3[2])) 66 ''' 67 4497919088 4498367856 4498449216 68 4497919088 4498367856 4498595328 69 ''' 70 # print(list3) 71 # print(id(list1[2][0]),id(list1[2][1])) 72 # print(id(list3[2][0]),id(list3[2][1])) 73 74 list1[0]='EGON' 75 list1[1]='LXX' 76 77 list1[2][0]=111 78 list1[2][1]=222 79 # print(list1) 80 81 print(list3)
1 # 1、循环的语法与基本使用 2 ''' 3 print(1) 4 while 条件: 5 代码1 6 代码2 7 代码3 8 print(3) 9 ''' 10 11 # count=0 12 # while count < 5: # 5 < 5 13 # print(count) # 0,1,2,3,4 14 # count+=1 # 5 15 # 16 # print('顶级代码----->') 17 18 19 # 2、死循环与效率问题 20 # count=0 21 # while count < 5: # 5 < 5 22 # print(count) # 0,1,2,3,4 23 24 # while True: 25 # name=input('your name >>>> ') 26 # print(name) 27 28 # 纯计算无io的死讯会导致致命的效率问题 29 # while True: 30 # 1+1 31 32 # while 1: 33 # print('xxxx') 34 35 # 3、循环的应用 36 username = 'egon' 37 password = '123' 38 39 # 两个问题: 40 # 1、重复代码 41 # 2、输对了应该不用再重复 42 # while True: 43 # inp_name=input('请输入您的账号:') 44 # inp_pwd=input('请输入您的密码:') 45 # 46 # if inp_name == username and inp_pwd == password: 47 # print('登录成功') 48 # else: 49 # print('账号名或密码错误') 50 51 52 # 4、退出循环的两种方式 53 # 方式一:将条件改为False,等到下次循环判断条件时才会生效 54 # tag=True 55 # while tag: 56 # inp_name=input('请输入您的账号:') 57 # inp_pwd=input('请输入您的密码:') 58 # 59 # if inp_name == username and inp_pwd == password: 60 # print('登录成功') 61 # tag = False # 之后的代码还会运行,下次循环判断条件时才生效 62 # else: 63 # print('账号名或密码错误') 64 # 65 # # print('====end====') 66 67 # 方式二:break,只要运行到break就会立刻终止本层循环 68 # while True: 69 # inp_name=input('请输入您的账号:') 70 # inp_pwd=input('请输入您的密码:') 71 # 72 # if inp_name == username and inp_pwd == password: 73 # print('登录成功') 74 # break # 立刻终止本层循环 75 # else: 76 # print('账号名或密码错误') 77 # 78 # # print('====end====') 79 80 81 # 7、while循环嵌套与结束 82 ''' 83 tag=True 84 while tag: 85 while tag: 86 while tag: 87 tag=False 88 89 90 # 每一层都必须配一个break 91 while True: 92 while True: 93 while True: 94 break 95 break 96 break 97 ''' 98 ## break的方式 99 # while True: 100 # inp_name=input('请输入您的账号:') 101 # inp_pwd=input('请输入您的密码:') 102 # 103 # if inp_name == username and inp_pwd == password: 104 # print('登录成功') 105 # while True: 106 # cmd=input("输入命令>: ") 107 # if cmd == 'q': 108 # break 109 # print('命令{x}正在运行'.format(x=cmd)) 110 # break # 立刻终止本层循环 111 # else: 112 # print('账号名或密码错误') 113 # 114 # # print('====end====') 115 116 # # 改变条件的方式 117 # tag=True 118 # while tag: 119 # inp_name=input('请输入您的账号:') 120 # inp_pwd=input('请输入您的密码:') 121 # 122 # if inp_name == username and inp_pwd == password: 123 # print('登录成功') 124 # while tag: 125 # cmd=input("输入命令>: ") 126 # if cmd == 'q': 127 # tag=False 128 # else: 129 # print('命令{x}正在运行'.format(x=cmd)) 130 # else: 131 # print('账号名或密码错误') 132 133 134 # 8、while +continue:结束本次循环,直接进入下一次 135 # 强调:在continue之后添加同级代码毫无意义,因为永远无法运行 136 # count=0 137 # while count < 6: 138 # if count == 4: 139 # count+=1 140 # continue 141 # # count+=1 # 错误 142 # print(count) 143 # count+=1 144 145 # 9、while +else:针对break 146 # count=0 147 # while count < 6: 148 # if count == 4: 149 # count+=1 150 # continue 151 # print(count) 152 # count+=1 153 # else: 154 # print('else包含的代码会在while循环结束后,并且while循环是在没有被break打断的情况下正常结束的,才不会运行') 155 156 # count=0 157 # while count < 6: 158 # if count == 4: 159 # break 160 # print(count) 161 # count+=1 162 # else: 163 # print('======>') 164 165 166 # 应用案列: 167 # 版本1: 168 # count=0 169 # tag=True 170 # while tag: 171 # if count == 3: 172 # print('输错三次退出') 173 # break 174 # inp_name=input('请输入您的账号:') 175 # inp_pwd=input('请输入您的密码:') 176 # 177 # if inp_name == username and inp_pwd == password: 178 # print('登录成功') 179 # while tag: 180 # cmd=input("输入命令>: ") 181 # if cmd == 'q': 182 # tag=False 183 # else: 184 # print('命令{x}正在运行'.format(x=cmd)) 185 # else: 186 # print('账号名或密码错误') 187 # count+=1 188 189 # 版本2:优化 190 count=0 191 while count < 3: 192 inp_name=input('请输入您的账号:') 193 inp_pwd=input('请输入您的密码:') 194 195 if inp_name == username and inp_pwd == password: 196 print('登录成功') 197 while True: 198 cmd=input("输入命令>: ") 199 if cmd == 'q': # 整个程序结束,退出所有while循环 200 break 201 else: 202 print('命令{x}正在运行'.format(x=cmd)) 203 break 204 else: 205 print('账号名或密码错误') 206 count+=1 207 else: 208 print('输错3次,退出')
作者:华王
博客:https://www.cnblogs.com/huahuawang/