python之基础1
一、python介绍
介绍
python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器。Python这个名字,来自Guido所挚爱的电视剧Monty Python’s Flying Circus。他希望这个新的叫做Python的语言,能符合他的理想:创造一种C和shell之间,功能全面,易学易用,可拓展的语言。
最新的TIOBE排行榜,Python赶超PHP占据第4, Python崇尚优美、清晰、简单,是一个优秀并广泛使用的语言。
Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。
1.web开发
Python拥有很多免费数据函数库、web模板系统、以及与web服务器进行交互的库,可以实现web的开发,目前比较有名气的Python web框架为flask和Django。这两款框架的效率都非常高
2.桌面开发
Python在图形界面开发上也很强大,可以利用tkinter/PyQT框架开发各种桌面软件!
3.网络编程
支持高并发的Twisted网络框架, python3引入的asyncio使异步编程变的非常简单(python2没有)
4.爬虫
在爬虫领域python的绝对是霸主地位,无人能及
5.人工智能
这个我就不多说了吧,地球人都知道python在人工智能的地位
6.云计算
Python是从事云计算工作需要掌握的一门编程语言,目前很火的云计算框架OpenStack就是由Python开发的,如果想要深入学习并进行二次开发,就需要具备Python的技能。
7.自动化运维
Python是一门综合性的语言,能满足绝大部分自动化运维需求,前端和后端都可以做,从事该领域,应从设计层面、框架选择、灵活性、扩展性、故障处理、以及如何优化等层面进行学习。
8.游戏开发
在网络游戏开发中,Python也有很多应用,相比于Lua or C++,Python比Lua有更高阶的抽象能力,可以用更少的代码描述游戏业务逻辑,据我所知《文明》这款游戏就是python写的
9.科学运算
97年开始,NASA就在大量使用Python在进行各种复杂的科学运算,随着NumPy, SciPy, Matplotlib, Enthought librarys等众多程序库的开发,使的Python越来越适合于做科学计算、绘制高质量的2D和3D图像。和科学计算领域最流行的商业软件Matlab相比,Python是一门通用的程序设计语言,比Matlab所采用的脚本语言的应用范围更广泛
二、python真实的应用场景
CIA: 美国中情局网站就是用Python开发的
NASA: 美国航天局(NASA)大量使用Python进行数据分析和运算
YouTube:世界上最大的视频网站YouTube就是用Python开发的
Dropbox:美国最大的在线云存储网站,全部用Python实现,每天网站处理10亿个文件的上传和下载
Instagram:美国最大的图片分享社交网站,每天超过3千万张照片被分享,全部用python开发
Facebook:大量的基础库均通过Python实现的
linux系统: 世界上最流行的Linux发行版本中的yum包管理工具就是用python开发的
豆瓣: 公司几乎所有的业务均是通过Python开发的
知乎: 国内最大的问答社区,通过Python开发(国外Quora)
春雨医生:国内知名的在线医疗网站是用Python开发的
除上面之外,还有搜狐、金山、腾讯、盛大、网易、百度、阿里、淘宝 、土豆、新浪、果壳等公司都在使用Python完成各种各样的任务。
三、Python的就业方向
发展前景一:Linux运维
发展前景二:Python Web网站工程师
发展前景三:Python自动化测试
发展前景四:数据分析
发展前景五:人工智能
四、windows安装python解释器
打开官网 https://www.python.org/downloads/windows/ 下载中心
测试安装是否成功:cmd下输入python关键字,如果能进入交互界面表示OK
pycharm安装方法
https://blog.csdn.net/pdcfighting/article/details/80297499
pip介绍
pip的用法其实跟linux的yum很像,它可以帮我们安装python所需要的环境包,并且可以包解决依赖关系
列出已安装的包
pip list
安装要安装的包
pip install xxx
安装特定版本
pip install django==1.1.5
导出python的环境
pip freeze > requestment.txt
从导出的python环境中安装所需要的包
pip install -r requestment.txt
卸载导出的python环境中的包
pip uninstall -r requestment.txt
升级包
pip install -U <包名>
显示包所在的目录
pip show -f <包名>
搜索包
pip search <搜索关键字>
查询可升级的包
pip list -o
下载包而不安装
pip install <包名> -d <目录> 或 pip install -d <目录> -r requirements.txt
更换国内pypi镜像
阿里:https://mirrors.aliyun.com/pypi/simple
豆瓣:http://pypi.douban.com/simple
中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/simple/
pip install <包名> -i http://pypi.v2ex.com/simple
指定全局安装源
在unix和macos,配置文件为:$HOME/.pip/pip.conf
在windows上,配置文件为:%HOME%\pip\pip.ini
(1):在windows文件管理器中,输入 %APPDATA%
(2):会定位到一个新的目录下,在该目录下新建pip文件夹,然后到pip文件夹里面去新建个pip.ini文件
(3):在新建的pip.ini文件中输入以下内容,搞定文件路径:"C:\Users\Administrator\AppData\Roaming\pip\pip.ini"
[global] timeout = 6000 index-url = http://pypi.douban.com/simple
创建python的虚拟环境
为什么需要虚拟环境:
如果你现在用Django 1.10.x
写了个网站,然后你的领导跟你说,之前有一个旧项目是用Django 0.9
开发的,让你来维护,但是Django 1.10
不再兼容Django 0.9
的一些语法了。这时候就会碰到一个问题,我如何在我的电脑中同时拥有Django 1.10
和Django 0.9
两套环境呢?这时候我们就可以通过虚拟环境来解决这个问题。
安装虚拟环境:
virtualenv
是用来创建虚拟环境的软件工具,我们可以通过pip
或者pip3
来安装
pip install virtualenv
pip3 install virtualenv
创建虚拟环境:
创建虚拟环境非常简单,通过以下命令就可以创建了:
virtualenv [虚拟环境的名字]
进入虚拟环境:
虚拟环境创建好了以后,那么可以进入到这个虚拟环境中,然后安装一些第三方包,进入虚拟环境在不同的操作系统中有不同的方式,一般分为两种,第一种是Windows
,第二种是*nix
:
windows
进入虚拟环境:进入到虚拟环境的Scripts
文件夹中,然后执行activate
。- linux进入虚拟环境:
source /path/to/virtualenv/bin/activate
一旦你进入到了这个虚拟环境中,你安装包,卸载包都是在这个虚拟环境中,不会影响到外面的环境。
退出虚拟环境:
退出虚拟环境很简单,通过一个命令就可以完成:deactivate
。
创建虚拟环境的时候指定Python
解释器:
在电脑的环境变量中,一般是不会去更改一些环境变量的顺序的。也就是说比如你的Python2/Scripts
在Python3/Scripts
的前面,那么你不会经常去更改他们的位置。但是这时候我确实是想在创建虚拟环境的时候用Python3
这个版本,这时候可以通过-p
参数来指定具体的Python
解释器:
virtualenv -p C:\Python36\python.exe [virutalenv name]
virtualenvwrapper
virtualenvwrapper
这个软件包可以让我们管理虚拟环境变得更加简单。不用再跑到某个目录下通过virtualenv
来创建虚拟环境,并且激活的时候也要跑到具体的目录下去激活。
安装virtualenvwrapper
linux:pip install virtualenvwrapper。
windows:pip install virtualenvwrapper-win。
virtualenvwrapper
基本使用:
-
创建虚拟环境:
mkvirtualenv my_env
那么会在你当前用户下创建一个
Env
的文件夹,然后将这个虚拟环境安装到这个目录下。
如果你电脑中安装了python2
和python3
,并且两个版本中都安装了virtualenvwrapper
,那么将会使用环境变量中第一个出现的Python
版本来作为这个虚拟环境的Python
解释器。 -
切换到某个虚拟环境:
workon my_env
-
退出当前虚拟环境:
deactivate
-
删除某个虚拟环境:
rmvirtualenv my_env
-
列出所有虚拟环境:
lsvirtualenv
修改mkvirtualenv
的默认路径:
在我的电脑->右键->属性->高级系统设置->环境变量->系统变量
中添加一个参数WORKON_HOME
,将这个参数的值设置为你需要的路径。
创建虚拟环境的时候指定Python
版本:
在使用mkvirtualenv
的时候,可以指定--python
的参数来指定具体的python
路径:
mkvirtualenv --python==C:\Python36\python.exe hy_env
五、变量
变量是什么?什么是变量?变量有什么好处?
变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储Script运行时可更改的程序信息。例如,可以创建一个名为ClickCount的变量来存储用户单击Web页面上某个对象的次数。使用变量并不需要了解变量在计算机内存中的地址,只要通过变量名引用变量就可以查看或更改变量的值。在例如:咱们平时玩的游戏都有level,打怪就升级,那个level就是变量
变量定义的规范:
变量名只能是字母、数字或下划线的任意组合
变量名的第一个字符不能是数字
变量名不能为关键字,比如 and,as,break,class,continue,def,del............
变量名字尽量起个个有意义的名字,比如:name=‘张三’,不要词不达意,比如:aaa='张三'
变量名字不要起过长
变量名字尽量不要起拼音或者汉字
变量应该具有的属性或者特征
name='疯子'
id,type,value
id——代表变量的内存地址
type——代表变量的数据类型
value——代表等号右边的值
这3个特点缺一个都不叫变量
python的小整数池
在交互模式下python有一个小的整数池,他的范围是[-5,256],这么做的好处是避免浪费空间和资源
只要是在这个数值内,内存地址都一样
在pycharm中,pycharm出于对性能的考虑会扩大这个整数池,至于扩大到多少,视内存而定
六、常量
常量即代表不变的量,其实在python里不存在真正不变的量,只不过潜规则在我们想定义一个常量的时候变量名为大写即为常量:
比如:一个人的年纪不断的增长,那么年纪就叫常量,如果这个人死了,那么他的年纪就被定格在了那一年的年纪上,这个时候年纪就是常量
AGE=60
七、用户与程序(python)交互
首先来说什么是交互,交互就跟人与人对话一样,你有来言,我有去语,能够对话...能够沟通,那么用户怎么跟程序去对话呢?这时候我们可以调用python的一个内置函数,叫:input
#例子 name = input() print(name) #如果你想让程序有提示信息 name = input("what's your name?") print(name)
八、注释
随着代码越来越多,如果你不写注释的话可能过几天连自己写的代码都不知道写的什么意思,更何况是别人了,因此就需要有注释来提示用户
单行注释可以用#表示,#号右边的为注释内容 如果要多行注释可以用''' ''',左右两边一边1个3引号中间的部分就是注释的内容
九、数据类型
数字
#int整型 定义:age=10 #age=int(10) 用于标识:年龄,等级,身份证号,qq号,个数 #float浮点型 定义:salary=3.1 #salary=float(3.1) 用于标识:工资,身高,体重,
字符串
单引号,多引号,三引号的区别和作用 #多行字符串需要用到三引号 双引号和单引号都是用来定义单行字符串的,那么2者有什么区别呢,举个例子 想把这个句话定义成字符串怎么办? what's your name 这句话当中有一个单引号了,如果我们在用单引号把他包起来,他就会报错,因此,我们需要在外面用双引号包裹起来 res = "what's your name"
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#在python当中数字可以进行加法,那么字符串可以吗?让我大声的告诉你,也可以 a = '你' b = '好' a + b #结果为'你好' #注意,字符串只能和字符串相加,不能和别的数据类型相加
列表
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#在[]内用逗号分隔,可以存放任意个任意类型的值比如(数字,字符串,列表,元组都OK),#用于标识存储多个值,比如一个班级的学生有多个,一个人的兴趣爱好也有多个 >>> test = [1,2,'a',[1,2],{'a','b'}] >>> test [1, 2, 'a', [1, 2], {'b', 'a'}] >>> #利用下标取列表里的值 >>> test[0] 1 >>>
元组
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
元组跟列表一样都可以存取多个值,只不过元组大部分是用来读的
字典
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#既然有了列表可以存取多个值,为什么还要有字典呢?举个例子你就明白了 比如在这个列表中有2个值一个28用来表示年纪,一个187用来标识身高,但是并没有一个说明,那个元素对应的是年纪,那个元素对应的是身高 info = [28,187] #因此,字典就可以解决这个问题 info = {'age':28,'high':187}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
info={ 'name':'fengzi', 'hobbies':['play','sleep'], 'company_info':{ 'name':'宏福', 'type':'education', } } info['company_info']['name']#取公司名字
布尔
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#布尔类型就是True和False >>> a=100 >>> b=200 >>> >>> a > b #不成立就是False,也就是假 False >>> a < b #成立就是True, 也就是真 True #谨记 #0,None,空都为假,其余为真
引用计数和垃圾回收机制
十、可变类型和不可变类型
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#1.可变类型:在id不变的情况下,value可以变,则称为可变类型,如列表,字典 #2. 不可变类型:value一旦改变,id也改变,则称为不可变类型(id变,意味着创建了新的内存空间)
十一、格式化输出
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式 #比如要求用户输入用户名和年龄,然后打印如下格式: My name is xxx,my age is xxx. #这种情况下就用到了%s和%d res = 'my name is %s, my age is %d' % ('疯子',29) print(res) #这里要注意%d只可以接收数字,%s可以接收数字也可以接收字符串
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#第一种方法,传递参数 res = 'my name is {name}, my age is {age}'.format(name='疯子',age=29) print(res) #第二种方法按顺序 res = 'my name is {0}, my age is {1}'.format('疯子',29) print(res)
内置函数(len,in,not in)
十二、基本运算符
a = 10 b=20
十三、比较运算符
十四、赋值运算符
十五、身份运算符
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#is表示id是否相等,也就是比较内存地址是否一致,一致为True,不一致为False #==表示两个值是否一致,一致为True,不一致为False
十六、流程控制if...else....
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
name = '疯子' res = input('你叫什么名字?') if res == name: print('帅哥') else: print('丑男')
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#如果:女人的年龄>=18并且<22岁并且身高>170并且体重<100并且是漂亮的,那么:表白,否则:叫阿姨 age_of_girl=18 height=171 weight=99 is_beautiful=True if age_of_girl >= 18 and age_of_girl < 22 and height > 170 and weight < 100 and is_beautiful == True: print('表白...')else: print('阿姨好')
十七、逻辑运算符
小练习:
#1.定义布尔型变量 has_ticket 表示是否有车票 #2.定义整形变量 knife_length 表示刀的长度,单位:厘米 #3.首先检查是否有车票,如果有,才允许进行安检 #4.安检时,需要检查棍子的长度,判断是否超过20厘米 # 如果超过20厘米,提示棍子的长度,不允许上车 # 如果不超过20厘米,按键通过 #5.如果没有车票,不允许进门
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
has_ticket = True stick_length = 22 if has_ticket: if stick_length > 20: print('你的棍子太长了',stick_length) else: print('请进....') else: print('您没有车票,不允许进入车站')
十八、流程控制之while
while 条件: # 循环体 # 如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件。。。 # 如果条件为假,那么循环体不执行,循环终止
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
num = 0 while num < 5: print(num) num+=1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
num = 0 while num <= 10: if num % 2 ==0: print(num) num += 1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import time num = 0 while True: print(num) num += 1 time.sleep(1)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
count = 0 while count <= 5 : count += 1 print("Loop",count) else: print("循环正常执行完啦") print("-----out of while loop ------") 输出 Loop 1 Loop 2 Loop 3 Loop 4 Loop 5 Loop 6 循环正常执行完啦 -----out of while loop ------
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
for letter in 'Python': # continue第一个实例 if letter == 'h': continue print('当前字母 :', letter) var = 10 # continue第二个实例 while var > 0: var = var -1 if var == 5: continue print('当前变量值 :', var) print("Good bye!") count = 0 #break实例 while True: print(count) count+=1 if count == 5: break
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import random win = 0 lost = 0 ping = 0 while True: print('\033[31m胜:%s 输:%s 平:%s\033[0m' % (win, lost, ping)) chooses = ['石头', '剪刀', '布'] print('欢迎来猜拳\n1.石头 2.剪刀 3.布 4退出') hum = input('请出拳:') computer = random.choice(chooses) if (hum == '1' and computer == '石头') or (hum == '2' and computer == '剪刀') or (hum == '3' and computer == '布'): ping += 1 print('\033[31m不要走,决战到天亮!!\033[0m') elif (hum == '1' and computer == '剪刀') or (hum == '2' and computer == '布') or (hum == '3' and computer == '石头'): win += 1 print('\033[31m你好NB!!\033[0m') elif (hum == '1' and computer == '布') or (hum == '2' and computer == '石头') or (hum == '3' and computer == '剪刀'): lost += 1 print('\033[31m你个损塞\033[0m') elif hum == '4': break elif not hum: continue else: print('输入错误!!') print('\033[31m=\033[0m' * 50)
十九、流程控制之for循环
1 迭代式循环:for,语法如下
for i in range(10):
缩进的代码块
2 break与continue(同上)
文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#在python3中如何打开一个文件呢? f = open('lock.txt', 'r',encoding='utf-8')#应用程序向操作系统发起打开文件的操作 print(f.read())#操作系统打开文件得到文件句柄返回给应用程序并赋值给f f.close()#应用程序向操作系统发起关闭文件的信号,并且回收变量f #注意:操作完文件后一定要记得关闭,因为如果开的文件多了,不关闭,会浪费系统资源,使系统变慢 #但是还是有很多同学忘记关闭文件,因此,可以用下面这个方式 with open('lock.txt', 'r', encoding='utf-8') as f: print(f.read()) #这里要注意字符编码,秉承一个原则就不会出现乱码(用什么方式写的,就用什么方式打开)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
r ,#只读模式【默认模式,文件必须存在,不存在则抛出异常】 w,#只写模式【不可读;不存在则创建;存在则清空内容】 a, #之追加写模式【不可读;不存在则创建;存在则只追加内容】 #以下三种跟上面三种一样,只不过是以二进制方式 rb wb ab 文本打开的常用模式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
操作文件的方法 #掌握 f.read() #读取所有内容,光标移动到文件末尾 f.readline() #读取一行内容,光标移动到第二行首部 f.readlines() #读取每一行内容,存放于列表中 f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符 f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符 f.writelines(['333\n','444\n']) #文件模式 #了解 f.readable() #文件是否可读 f.writable() #文件是否可读 f.closed #关闭文件 f.flush() #立刻将文件内容从内存刷到硬盘 f.name #查看打开的文件名 操作文件的方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
f.seek(0,0)等价于f.seek(0)#代表把光标移动到开头 f.seek(2,1)#代表在相对位置移动2个字节(1代表光标的相对位置,2代表在相对位置上把光标向后移动2个字节) f.seek(-3,2)#代表在末尾往前移动3个字节(2代表把光标移动到末尾,-3代表把光标向前移动3个字节) f.read(3)代表读取3个字符(意思是光标在第三个字节后面) 光标位置移动
二十、作业
编写一个用户登录程序
- 登录成功显示欢迎页面
- 登录失败显示密码错误,并显示错误几次
- 登录三次失败后,退出程序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
username = 'root' password = 'root' count = 0 print('请登录...') while True: user = input('username:') pwd = input('password:') if user == username and pwd == password: print('欢迎登陆') break else: count += 1 print('密码错误', count) if count == 3: print('滚') break
作业升级:
- 可以支持多个用户登录
- 用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
userinfo = { 'root':['root',0], 'fengzi':['fengzi',0], 'test': ['test',0] } while True: with open('lock.txt', 'r', encoding='utf-8') as f: username = input('username:') if not username: continue elif username in f.read(): print('您的账户已被锁定,请联系管理员') elif username in userinfo.keys(): password = input('password:') if password in userinfo[username][0]: print('欢迎页面') break else: userinfo[username][1] += 1 print('密码错误',userinfo[username][1]) if userinfo[username][1] >= 3: with open('lock.txt', 'a', encoding='utf-8') as f: f.write('%s|' % username) else: print('用户名不存在')