06 Python基础入门及安装和基础语法

Python基础入门及安装和基础语法

01-Python基本概述和环境搭建

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

-w1157

开发环境-Pyenv

  1. Python多版本管理工具
  2. 管理Python解释器
  3. 管理Python版本
  4. 管理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)
-w1116



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

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

04-Python基础

-w784
浮点型的计算对计算机来说是困难的,很多大型的计算机实际上是整型的计算机,所以浮点型计算解决比较麻烦的,比如电影后期制作的渲染, 大量的浮点型计算,是不是要并行的计算机来进行运算,所以并行现在还玩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))

作业:

  1. 打印九九乘法表
  2. 打印100以内的斐波那契数列
  3. 求斐波那契数列第101项
  4. 求10万内的所有素数

博客:可以是总结,可以是对习题的不同思路的思考入实现
要求:
所有课上习题要求重新整理当做作业自己实现
尽量所有程序自己能实现,不能实现的要求能写出思路或者伪代码

posted @ 2017-11-14 00:06  ShenghuiChen  阅读(555)  评论(1编辑  收藏  举报