第一篇 python基础(一)

 

前期准备:

官网链接:https://www.python.org/

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
centos7安装python
cd ~
mkdir .pip
cd .pip
vim pip.conf

#进入后添加以下内容,保存退出.
[global]
index-url = https://mirrors.aliyun.com/pypi/simple
修改pip安装源

    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
ubuntu 安装python3.8

 

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)
View Code

二 基本数据类型
  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中找相应的数据类型来让计算机像自己一样去记下事物的状态
View Code

 

   三 字符串格式化 & 运算符 & 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()
"{:>05d}.txt".format(i)
 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('其他代码.............')
流程控制之if判断
 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")}'
format & f 用法
五 深浅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)
深浅copy
  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次,退出')
while循环


posted @ 2021-05-01 16:52  风hua  阅读(132)  评论(0编辑  收藏  举报