06 Python基础入门及安装和基础语法
Python基础入门及安装和基础语法
01-Python基本概述和环境搭建
须知
课前预习
课上认真听讲,截图,临时笔记,记录问题和总结
课后自己整理笔记,知识整理过程(云笔记,思维导图)
作业:
随堂练习
基础知识习题
进阶知识习题
项目实战编码(实战部分只提供基本实现)
提问
先保留问题,记录下来,下课测试,对问题有了了解后,解决不了在提问

开发环境-Pyenv
- Python多版本管理工具
- 管理Python解释器
- 管理Python版本
- 管理Python的虚拟环境
官网 https://github.com/pyenv/pyenv
1、安装准备工件
官网
https://github.com/pyenv/pyenv
安装之前,确保已经安装了git
yum install git -y
安装其他依赖
yum -y install gcc make patch gdbm-devel openssl-devel sqlite-devel readline- devel zlib-devel bzip2-devel
创建用户
useradd python
passwd python
使用python用户登录,然后开始下面的安装
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
在python用户的~/.bash_profile中追加
[python@python9 ~]$ vim ~/.bash_profile
export PATH="/home/python/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
在当前终端下重新加载下配置文件让其生效
[python@python9 ~]$ . .bash_profile
列出所有可用版本
[python@python9 ~]$ python -V
Python 2.6.6
[python@python9 ~]$ pyenv
pyenv 1.1.5
[python@python9 ~]$ pyenv help install
安装指定版本
[python@python9 ~]$ pyenv install 3.5.3 -v
#-v查看详细信息
列出所有可用版本
[python@python9 ~]$ pyenv versions
* system (set by /home/python/.pyenv/version)
3.5.3
注意:global最好不要使用
创建一个目录让local捆绑在一个目录下
[python@python9 ~]$ mkdir -p magedu/projects
[python@python9 ~]$ cd magedu/projects/
#让python版本捆绑在一个目录下
[python@python9 projects]$ pyenv local 3.5.3
[python@python9 projects]$ pyenv versions
system
* 3.5.3 (set by /home/python/magedu/projects/.python-version)
[python@python9 projects]$ python -V
Python 3.5.3
[python@python9 projects]$ cd
[python@python9 ~]$ python -V
Python 2.6.6
#你看如果在其它目录,python版本就是系统默认的2.6,local登录基本做到隔离
在安装Virtualenv插件(虚拟环境)
就是自己玩自己的小王国,你在里面装什么都可以,不会影响别人,这样包管理就独立的,Virtualenv就做包隔离
02-pyenv实战操作
在安装一个python版本
[python@python9 ~]$ pyenv install -v 3.6.1
创建虚拟环境,可以认为是自己定制的python版本
[python@python9 ~]$ cd .pyenv/versions/
[python@python9 versions]$ ls
3.5.3 3.6.1
现在我们把projects的捆绑的目录改回系统的版本,这个目录作为管理目录
[python@python9 projects]$ pyenv version
3.5.3 (set by /home/python/magedu/projects/.python-version)
[python@python9 projects]$ pyenv local system
[python@python9 projects]$ pyenv version
system (set by /home/python/magedu/projects/.python-version)
创建一个cmdb目录:
[python@python9 projects]$ mkdir -p cmdb
[python@python9 projects]$ cd cmdb/
#在这个目录下做个虚拟环境
[python@python9 cmdb]$ pyenv virtualenv 3.5.3 magedu353
[python@python9 cmdb]$ pyenv versions
* system (set by /home/python/magedu/projects/.python-version)
3.5.3
3.5.3/envs/magedu353
3.6.1
magedu353
[python@python9 cmdb]$ pyenv local magedu353
(magedu353) [python@python9 cmdb]$ pyenv version
magedu353 (set by /home/python/magedu/projects/cmdb/.python-version)
#这就是虚拟环境,而不是公共环境,这才是开发要做的环境
如果要做一个web服务,那么我们创建一个web目录
[python@python9 projects]$ mkdir web
[python@python9 projects]$ ls
cmdb web
[python@python9 projects]$ cd web/
[python@python9 web]$ python -V
Python 2.6.6
[python@python9 web]$ pyenv local 3.6.1
#但是这样不好,如果是多人开发还是使用虚拟环境
[python@python9 web]$ pyenv virtualenv 3.6.1 papa3.6.1
[python@python9 web]$ pyenv local papa3.6.1
pip包管理器
在cmdb目录的虚拟环境下使用pip安装redis
[python@python9 projects]$ cd cmdb/
(magedu353) [python@python9 cmdb]$ pip -V
pip 9.0.1 from /home/python/.pyenv/versions/3.5.3/envs/magedu353/lib/python3.5/site-packages (python 3.5)
(magedu353) [python@python9 cmdb]$ pip install redis
#但是这样pip安装很慢,所以我们配置上pip配置成阿里云
pip通用配置
[python@python9 ~]$ mkdir .pip
[python@python9 ~]$ cd .pip/
[python@python9 .pip]$ vim pip.conf
[global]
index-url=http://mirrors.aliyun.com/pypi/simple
trusted-host=mirrors.aliyun.com
[python@python9 .pip]$ cd ~/magedu/projects/cmdb/
#查看刚安装的redis在虚拟环境的安装路径
[python@python9 ~]$ cd .pyenv/versions/3.5.3/envs/magedu353/lib/python3.5/site-packages/
[python@python9 site-packages]$ ls
easy_install.py pkg_resources redis-2.10.6.dist-info
pip __pycache__ setuptools
pip-9.0.1.dist-info redis setuptools-28.8.0.dist-info
#你看有redis在虚拟环境,接下来我们看看公共环境
[python@python9 site-packages]$ pwd
/home/python/.pyenv/versions/3.5.3/lib/python3.5/site-packages
[python@python9 site-packages]$ ls
easy_install.py pip-9.0.1.dist-info __pycache__ setuptools
pip pkg_resources README setuptools-28.8.0.dist-info
#你看公共环境这个没有安装redis
所以还是使用虚拟环境,可以很好的启到模块的隔离
安装ipython
[python@python9 projects]$ cd cmdb/
(magedu353) [python@python9 cmdb]$ pip install ipython
#记住了在cmdb这个环境安装的ipython只在这个目录的环境才有离开这个目录就没有了
(magedu353) [python@python9 cmdb]$ ipython
Python 3.5.3 (default, Nov 11 2017, 11:43:01)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: print ('magedu.com')
magedu.com
In [2]: exit
安装网页版本Jupyter
提示:安装Jupyter,也会安装ipython的
(magedu353) [python@python9 cmdb]$ pip install jupyter
(magedu353) [python@python9 cmdb]$ jupyter notebook help
#这个notebook很强大,上面可以写markdown、还支持多种python在里面运行...
(magedu353) [python@python9 cmdb]$ jupyter notebook password
Enter password: 123456
#启动
(magedu353) [python@python9 cmdb]$ jupyter notebook --ip=0.0.0.0 &

[python@python9 ~]$ cd magedu/projects/cmdb/
(magedu353) [python@python9 cmdb]$ touch test.py
#创建一个目录然网页上就可以看到了


接下来在这个环境,把安装的所有包导出:
(magedu353) [python@python9 cmdb]$ pip freeze >/tmp/packs.txt
(magedu353) [python@python9 cmdb]$ cat /tmp/packs.txt
#我们去web环境目录
(magedu353) [python@python9 cmdb]$ cd ../web/
(papa3.6.1) [python@python9 web]$ pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
pip (9.0.1)
setuptools (28.8.0)
(papa3.6.1) [python@python9 web]$ pip install -r /tmp/packs.txt
#这样就相当于在部署跟cmdb上的环境包了(导入包)
(papa3.6.1) [python@python9 web]$ pip list
ipykernel (4.6.1)
ipython (6.2.1)
ipython-genutils (0.2.0)
ipywidgets (7.0.4)
jedi (0.11.0)
Jinja2 (2.10)
jsonschema (2.6.0)
jupyter (1.0.0)
jupyter-client (5.1.0)
jupyter-console (5.2.0)
jupyter-core (4.4.0)
MarkupSafe (1.0)
mistune (0.8.1 ...
#这样的话cmdb有的功能,这个web也有了
03-计算机语言理论基础
IPython Jupyter
IPython
增强的Python Shell,自动补全、自动缩进、支持shell、增加了很多函数
Jupyter
Jupyter notebook password
Jupyter notebook --ip=0.0.0.0 --port=8888
从IPython中独立出来
独立的交互式笔记本,后台使用Ipython
快捷键:shift+Enter、Ctrl+Enter、dd、m

所有的程序要加载到内存,然后cpu寻址读取,拿到cpu上进行计算运行,cpu计算好后在输出到内存中。
cpu上有很多寄存器,所以以后写程序要考虑cpu的寄存器跟cpu的多级缓存问题。(cpu只认识0和1)




面向对象在特定环境下如;数据分析领域,并行计算领域,效率并不高,所以用函数式语言。

计算的出现及所有的程序都是为了解决处理数据问题。
解决问题的办法就是算法。

04-Python基础

浮点型的计算对计算机来说是困难的,很多大型的计算机实际上是整型的计算机,所以浮点型计算解决比较麻烦的,比如电影后期制作的渲染, 大量的浮点型计算,是不是要并行的计算机来进行运算,所以并行现在还玩GPU显卡那个,这都是发展方向。

In [1]: print('abc' + 'efg')
abcefg
In [1]: ''' welcome "to"
1\
2\
3\
'''
Out[2]: ' welcome "to"\n123\n\n'
In [3]: _
Out[3]: ' welcome "to"\n123\n\n'
In [4]: print(_)
welcome "to"
123
In [5]: print(r"welcome \n magedu")
welcome \n magedu



静态语言特点,变量要先声明是什么类型的(string int),类型就不能改变。
强类型语言:(报错说明是强类型语言)

弱类型语言:F12浏览器(不同类型可以加起来)


In [1]: 1/5
Out[1]: 0.2
In [2]: 1//5
Out[2]: 0
In [3]: 5%3
Out[3]: 2
位运算你要知道数字在计算机是怎么存的(在计算机系统中,数值一律用补码来表示和存储);
计算机在存储数据,不管什么语言都是按照原码、反码、补码、负数表示。
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路

数字电路都是门电路,不能做的太复杂所以只对加法、乘法实现,所以对减法,除法是比较复杂的,减法就转换成加法来处理。
0000 1100 12
1111 0011
1000 1101
上面对应的分别是原码、反码、补码
~12的二进制表示(12取反)
0000 1100 12(原码,第8个表示的是符号位)
1111 0011 12(反码)
由于最高位是1也就是第8位是1所以认为这是负数那么负数符号位不变,其余按位取反后+1,所以在计算机都是使用补码存储的,补码是:
1000 1101 -->-13 12(补码) 所以结果在内存中是-13(补码的补码就是原码)
In [1]: ~12
Out[1]: -13
5的二进制表示(在计算机的存储是什么)
0000 0101 5(正数原码就是补码,所以在计算机就是5)
In [6]: 5
Out[6]: 5
-1的原码是:1000 0001
-1的补码是:1111 1111 这就是-1,所以在内存中所以在内存中看到的-1应该是0xff或1111 1111
5-1就是5+(-1)
0000 0101 (5补码)
1111 1111 0xff(-1补码)
0000 0100
0000 0000 #溢出位不要全移动1位,就是这样在2个相加
0000 0100 结果是4
#这样你就知道数据在内存中怎么放的,在计算机上,内存上的数据用补码来表示存储

运算符
- 赋值运算符
a = min(3,5)
+= -= *= /= %=
x = y = z = 10
- 成员运算符
in、not、in
- 身份运算符
is、is not
05-Python分支语句
10^9等于?10^-9等于?
^ 表示异或
0000 1010 -->10
0000 1001 -->9
0000 0011 -->结果是3
In [10]: 10^9
Out[10]: 3
10^-9
0000 1010 -->10
0000 1001 -->9 原码
1111 0110 -->9反码
1000 1001 -->-9补码
#数据在内存中怎么放的就是转成这个二进制这样放的,这就是计算机数据的存放
1000 0011 -->结果是-3
In [11]: 10^-9
Out[11]: -3
所以这个就是计算机的原码、反码,补码,其实做这个不是折腾你,它是为了让计算机,计算方便,简化cpu的设计引入的。这么精巧的设计确实很方便。



内存管理:
引用计数变为0(也可以说是指针不指向数据)可以被垃圾回收GC。
像java或python这种虚拟机语言,它有一套内存管理机制,管理机叫GC,GC就是为了给你整理内存,减少程序员的工作,只要变量没人用了,变量在超出作用域的时候,就失效了,没人用,引用计数就减为0了。一定时间会被清理掉。从内存中清理掉这就是垃圾清除,垃圾清除是不是对内存来说有用的内存就有了,但是,很多个变量放在内存大家排起来一起,你把这个变量消亡了,又把那个变量消亡了,那么内存是不是出现空洞呀,这不就是c++存在的问题嘛,你是有内存管理机制,你是能回收了,不需要我自己释放,但是内存中的空洞出来了,这叫碎片化,那么这种碎片化怎么办呢?所以它还有个叫垃圾回收,还有一个回收,回收内存整理的过程然后它分了很多代,这个跟java是一样的,经常变化的放到经常的代里面去,不经常变化的放到不经常变化的代,解决了内存回收及内存碎片化的问题,这就是GC的功能。所以成了GC败了GC啊,GC你交给它了看似你轻松了,但是这个轻松是有代价的,它的时机把握是否准确?所以在GC回收的时候要考虑GC的回收时机,你最忙的时候它给你做内存整理全阻塞在那了,对不对,它要把你的数据是不是要搬到另一个地方去,这一旦出现这种搬的过程你什么事都干不了,所以GC是好东西,你的编程负担是减轻了,但是效率问题呢?其实在虚拟机的这种调优,更多的是做GC参数的调优,这是你要考虑的问题。
在生产环境中如果你的GC并没有带来很大影响,你别一上来就调GC,你调了之后还没人家自己跑的快呢,就是它自动管理的比你还好,这个东西不是随便调整的,你的数据的特征你都没把握住,你还没采集过数据不知道你的数据处理的负担如何,你就调GC,那恐怕不行。你要有很多参数对照你才能调这东西。不要乱调,说不定越调性能越差。
可能今天讲的东西属于稍微有点难理解,但是我已经讲的比较简单了,但是对你来说,这是你的基本功,如果我不讲这个,我觉得是对你的不负责任,你会发现你永远成不了高手,这讲的都是你在多本书找到的,这些先记小本上,以后回过头可能你有更深的理解

顺序就是串行,一个接一个呗。
单分支结构
if语句
if condition:
代码块
condition必须是一个bool类型,这个地方有一个隐式转换bool(condition)
if 1<2:
print('1 less than 2')
代码块
类似于if语句的冒号后面的就是一个语句块
在if、for、def、class等



练习:
给定一个不超过5位的正整数,判断其有几位,使用input函数(折半)
val = input('>>>')
val = int(val)
if val >= 1000:
if val>=10000:
print(5)
else:
print(4)
else:
if val >=100:
print(3)
elif val >=10:
print(2)
else:
print(1)
06-windows开发环境搭建
07-Python循环及分之习题讲解
08-pyen安装进阶

flag = -10
while flag:
print(flag)
flag=flag+1

In [1]: range(10)
Out[1]: range(0, 10)
In [2]: range(0,10)
Out[2]: range(0, 10)
In [6]: help(range)
In [3]: list(range(0,10))
Out[3]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [5]: for i in range(10):
...: print(i+1)
...:
1
2
3
4
5
6
7
8
9
10
In [7]: list(range(5,10))
Out[7]: [5, 6, 7, 8, 9]
In [8]: list(range(5,10,2))
Out[8]: [5, 7, 9]
In [15]: for i in range(1,11):
...: i=10-i
...: print (i)
...:
9
8
7
6
5
4
3
2
1
0
In [19]: for i in range(10,0,-1):
...: print(i)
...:
10
9
8
7
6
5
4
3
2
1
In [20]: for i in range(10):
...: print(10-i)
...:
10
9
8
7
6
5
4
3
2
1

In [23]: for i in range(10):
...: if i %2:
...: print(i)
...:
...:
...:
...:
1
3
5
7
9
In [24]: for i in range(10):
...: if i %2:
...: continue
...: print(i)
In [25]: for i in range(10):
...: if i%2 ==0:
...: continue
...: print(i)
...:
1
3
5
7
9
或:
In [28]: for i in range(10):
...: if i%2 ==0:
...: continue
...: else:
...: print(i)
...:
...:
1
3
5
7
9
09-知识回顾及循环语句

count=0
for i in range(0,1000,7):
print(i)
count +=1
if count ==20:
break
或使用while实现
count=0
i=0
while True:
print(i)
i += 7
count += 1
if count == 20:
break
练习:
给定一个不超过5位的正整数,判断其有几位,依次打印出个位,十位,百位,千位,万位的数字
#方法1
num=int(input("请输入一个数字:"))
print(num)
countnum=0
while True:
print(num%10)
num=num//10
countnum+=1
if num ==0:
break
print("你输入的位数是:", countnum)
#方法2
val = input('>>>')
val = int(val)
print(val)
if val >=1000:
if val >= 10000:
num = 5
else:
num = 4
else:
if val >=100:
num =3
elif val >= 10:
num =2
else:
num =1
print(num)
#方法3
pre = 0
val = 82
num = 2
for i in range(2,0,-1):
cur = val//(10**(i-1))
print(cur - pre*10)
pre = cur
或
val = 82
pre = 0
num=2
for i in range(num,0,-1):
cur = val//(10**(i-1))
print(cur - pre*10)
pre =cur
10-循环及else子句
语法:
while condition:
block
else:
block
for element in iteratable:
block
else:
block
#如果循环正常的执行结束,就执行else子句;如果使用break终止,else子句不会执行
for i in range(5):
print(i)
else:
print('ok')
0
1
2
3
4
ok
for i in range(100):
if i > 50:
break
print(i)
else:
print ('ok')
练习:
- 打印一个边长为n的正方形
for i in range(6):
print('10\t'*6)
print('\t')
或
while True:
for i in range(1,11):
if i ==1:
print ('*' * 21)
elif i ==10:
print('*' * 21)
else:
print("*" + (' ' * 19) + '*')
break
或
i=0
while True:
i+=1
if (i==1 or i==5):
print ("0"*5)
else:
print('0 0')
if i==5:
break
- 求100内所有奇数的和(2500)
sum=0
for i in range(1,101,2):
sum+=i
else:
print(sum)
或:
sum =0
for i in range(1,100):
if i%2 !=0:
sum+=i
print(sum)
- 判断学生成绩,成绩等级AE。其中,90分以上为'A',8090分为'B',7079为'C',6069为'D',60分以下为'E'
num =int(input('>>>'))
if num >=90:
print("A")
elif 89 > num > 80:
print ("B")
elif 79 >num>=70:
print("C")
elif 69 > num >=60:
print("D")
else:
print("E")
或:
a=99
if a >89:
print("A")
elif a>79:
print("B")
elif a>69:
print("C")
elif a >59:
print("D")
else:
print("E")
- 求1到5阶乘之和(1+12+123+1234+12345)
nums =1
x=0
for n in range(1,6):
nums *=n
x +=nums
print(x)
或:
n=int(input("请输入阶乘之和的数:"))
multiply=1
sum=0
for i in range(1,n+1):
for j in range(1,i+1):
multiply*=j
sum +=multiply
multiply =1
print(str(n)+"的阶乘之和为:", sum)
- 给一个数,判断它是否是素数(质数)
质数:一个大于1的自然数只能被1和它本身整除
num =17
if num==2:
print('zhishu')
elif num>2:
for i in range(2,num):
if num%i==0:
print("not zhishu")
break
else:
print("zhishu")
或:
m=int(input("Plase input >1 number:"))
for i in range(2,m):
if m%i ==0:
print("is not zhishu")
break
else:
print("zhishu")
或:
natural_number=int(input("请输入一个数,来判断它是否是素数:"))
for i in range(2,natural_number):
if natural_number%i==0:
print(str(natural_number)+"不是素数")
break
else:
print(str(natural_number))
作业:
- 打印九九乘法表
- 打印100以内的斐波那契数列
- 求斐波那契数列第101项
- 求10万内的所有素数
博客:可以是总结,可以是对习题的不同思路的思考入实现
要求:
所有课上习题要求重新整理当做作业自己实现
尽量所有程序自己能实现,不能实现的要求能写出思路或者伪代码