一、WHAT'S PYTHON ?
1、python 简介
Python(英语发音:/ˈpaɪθən/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。
Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议 。
Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。
2、谁在用 python
Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。互联网公司广泛使用Python来做的事一般有:自动化运维、自动化测试、大数据分析、爬虫、Web 等。
3、python 的种类
- Cpython
Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。
- Jyhton
Python的Java实现,Jython会将Python代码动态编译成Java字节码,然后在JVM上运行。
- IronPython
Python的C#实现,IronPython将Python代码编译成C#字节码,然后在CLR上运行。(与Jython类似)
- PyPy(特殊)
Python实现的Python,将Python的字节码字节码再编译成机器码。
- RubyPython、Brython ...
4、python 优缺点
优点:
* Simple Elegant Clear (简单、优雅、明确)
* 强大的第三方库
* 易移植
* 面向对象
* 可扩展
缺点:
* 速度慢(相对环境)
* 代码不能加密
二、PYTHON BASE
1、安装 python 环境
For Linux:
如果是ubuntu14.04+的版本,那么默认的python就是2.7+啦
1 tom@python:~$ cat /etc/issue
2 Ubuntu 14.04.3 LTS \n \l
3
4 tom@python:~$ python -V
5 Python 2.7.6
如果是centos6系列,那么请升级你的默认python到2.7+
1 1、安装gcc,用于编译Python源码
2 yum install gcc
3 2、下载源码包,https://www.python.org/ftp/python/
4 3、解压并进入源码文件
5 4、编译安装
6 ./configure
7 make all
8 make install
9 5、查看版本
10 /usr/local/bin/python2.7 -V
11 6、修改默认Python版本
12 mv /usr/bin/python /usr/bin/python2.6
13 ln -s /usr/local/bin/python2.7 /usr/bin/python
14 7、防止yum执行异常,修改yum使用的Python版本
15 vi /usr/bin/yum
16 将头部 #!/usr/bin/python 修改为 #!/usr/bin/python2.6
For Windows:
1 1、下载安装包
2 https://www.python.org/downloads/
3 2、安装
4 默认安装路径:C:\python27
5 3、配置环境变量
6 【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【Python安装目录追加到变值值中,用 ; 分割】
7 如:原来的值;C:\python27,切记前面有分号
2、python 代码的执行过程
Call :滕兰老师说要把第一次交给“hello world”
#!/usr/bin/env python
# coding:utf-8
print 'hi,yue bu ?'
python 文件中的代码会由解释器进行语法/词法的分析,没有问题后进行编译调入内存执行。
python在执行.py的文件时会生成一个同名.pyc的文件,这个文件是源文件编译后的字节码文件,源文件编译成自解码后再转为机器可读的二进制码交给CPU处理。
3、什么是解释器?
解释器(Interpreter),又译为直译器,能够把高级编程语言转译运行。说白了就是一翻译(也许是最近抗战片看多了,总会联想到穿着一半日本军装的汉奸翻译* *)
4、内容编码
python解释器在读取.py文件中的代码时,会对内容进行编码(默认是ASCII)
ASCII
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。
1 >>> a = 'doudou'
2 >>> type(a)
3 <type 'str'>
UNICODE
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536。Unicode的出现是因为ASCII的表示空间有限。
1 >>> name = u'小花'
2 >>> type(name)
3 <type 'unicode'>
4 >>> name
5 u'\u5c0f\u82b1'
6 >>> len(name)
7 2
UTF-8
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。针对unicode的可变长度的字符编码,在内存中字符是Unicode进行处理的,硬盘存储的时再转为utf-8。
1 >>> name
2 u'\u5c0f\u82b1'
3 >>> name =name.encode('utf-8') # 使用encode将unicode转为utf-8
4 >>> name
5 '\xe5\xb0\x8f\xe8\x8a\xb1'
6 >>> len(name)
7 6
8 >>> name = name.decode('utf-8') # 使用decode将utf-8转为unicode
9 >>> name
10 u'\u5c0f\u82b1'
11 >>> len(name)
12 2
ps:在写脚本的时候默认是ASCII的编码方式,解释器读入内存的时候会转换为Unicode进行处理,如果出现中文就会提示不能识别,所以我们在写脚本的时候如果有中文,就要指定源文件以什么样的编码方式存储。
1 #!/usr/bin/env python
2 # coding:utf-8
3
4 count = 0
5、编程风格
python 的代码编写会遵循Simple、Elegant、Clear的风格。
缩进统一
1 开头行不能有空格
2 不同级别代码缩进不同
3 同一级别代码缩进必须相同
6、注释
对编写的代码文件要一定的注释,保证简单、易读,方便他人方便自己。
单行注释:# *****
1 # copy and rename
多行注释/格式化输出:’’’ ****** ‘’’
1 '''
2 copy
3 and
4 rename '''
三、流程控制
1、python模块的调用与传参的捕获
Python有大量的模块,从而使得开发Python程序非常简洁。类库有包括三中:
- Python内部提供的模块
- 业内开源的模块
- 程序员自己开发的模块
Python内部提供一个 sys 的模块,其中的 sys.argv 用来捕获执行执行python脚本时传入的参数
1 #!/usr/bin/env python
2 # coding:utf-8
3
4 import sys
5 print sys.argv
2、用户交互(输入内容)
raw_input、input
需求:要求用户输入用户名密码,正确后输出欢迎信息。
1 #!/usr/bin/env python
2 # coding:utf-8
3
4 user_name = 'tom'
5 user_password = '123'
6 input_name = raw_input('User Name:') # raw_input() 默认把输入的内容当作字符串来处理
7 input_password = input('Password:') # input() 会将输入的内容保留原格式输出
8 if input_name == user_name and input_password == user_password:
9 print "Welcome to Linux!"
10 else:
11 print "Login invalid"
getpass 用户输入内容不可见
1 #!/usr/bin/env python
2 # coding:utf-8
3
4 import getpass # 调用getpass模块
5 user_name = 'tom'
6 user_password = '123'
7 input_name = raw_input('User Name:')
8 input_password = getpass.getpass('Password:') # 引用功能,使用输入内容不可见
9 if input_name == user_name and input_password == user_password:
10 print "Welcome to Linux!"
11 else:
12 print "Login invalid"
3、if ...elif ...break/continue...else、while
需求:要求用户输入用户名密码,正确后输出欢迎信息,输错三次后退出。
1 #!/usr/bin/env python
2 # coding:utf-8
3
4 import getpass
5 count = 0
6 user_name = 'tom'
7 user_name1 = 'doudou'
8 user_password = '123'
9 while count < 3: # while 条件
10 input_name = raw_input('User Name:')
11 input_password = getpass.getpass('Password:')
12 if input_name == user_name1:
13 print "This user is not available."
14 continue # continue 中断本次循环
15 elif input_name == user_name and input_password == user_password:
16 print "Welcome to Linux!"
17 break # break 退出循环
18 else:
19 print "Login invalid"
20 count += 1 # 一定要注意代码块的区分与缩进 条件+1
四、数据类型
1、数据类型分类
>>>单值:
数字:(digital)
整型:(integer)
长整型:(long)
符点型:(float)
复数:(complex)
字符串:(string)
布尔值:(boolean)
>>>集合:
列表:(list)
元组:(tuple)
字典:(dict)
哈希表:(hash)
2、变量:(variable)
变量,不只是一个可变化的量,它是一段内存空间的命名,指向内存地址的符号链接
1 变量标识符命名规范:
2 1、标识符的第一个字符必须是字母(大小写字母)或”_”(下划线)
3 2、标识符的其它部分可以由字母、”_”、数字(0-9)组成
4 3、标识符严格区分大小写
5 4、以下关键字不能被定义为变量['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']
定义变量与输出变量:
1 >>> a = 'source'
2 >>> a
3 'source'
变量有意思的指向
1 >>> a = 'job'
2 >>> b = 'name'
3 >>> a = b
4 >>> a
5 'name'
6 >>> b
7 'name'
8 >>> b = 'age' # 当变量b重新定义的时候,而a并没有跟着b变化而变化,原因是:当a=b时,a的值是b所指向内存空间中的‘name’,所以当b重新定义新值的时候,a依然指向‘name’
9 >>> a
10 'name'
11 >>> b
12 'age'
3、字符串(string)
占位符:
1 >>> name = 'how old are you %s' % '24' # %s (str) %d (digital)
2 >>> name
3 'how old are you 24'
4 >>> mame = 'i am %s ,%d years old.' % ('xiaohua',24) # 多个占位符,需要在后面按顺序指定多个参数,只在内在中开辟一块空间。
5 >>> name
6 'how old are you 24'
7 # 也可以这样表示
8 >>> name = 'i am %s,%d years old.'
9 >>> name % ('xiaohua',24)
10 'i am xiaohua,24 years old.'
11 # 也可以这样表示,三种方式执行过程一样
12 >>> name = 'i am {0},age {1}'
13 >>> name.format('xiaohua',24)
14 'i am xiaohua,age 24'
索引/切片:
1 >>> name
2 'soure'
3 >>> name[0]
4 's'
5 >>> name[:0]
6 ''
7 >>> name[0:]
8 'soure'
9 >>> name[-1]
10 'e'
长度:len()
1 >>> len(name)
2 5
3 >>> print name[-1]
4 e
5 >>> print name[len(name)-1] # 最后一个值可以用len()做运算得到
6 e
去除空格:strip()
1 >>> name
2 ' home '
3 >>> print name.strip() # strip() 去除字符串两端的空格
4 home
5 >>> print name.lstrip() # lstrip() 去除字符串左端的空格
6 home
7 >>> print name.rstrip() # rstrip() 去除字符串右端的空格
8 home
分割:split()
1 >>> names = 'xiaohua,xiaoli'
2 >>> names
3 'xiaohua,xiaoli'
4 >>> names.split(',')
5 ['xiaohua', 'xiaoli'] # 字符串分割后得到一个列表
6 >>> names.split('h')
7 ['xiao', 'ua,xiaoli'
4、列表:(list)
列表是数据的集合,列表内的元素可以被查询、修改
1 >>> b = ['job', 'salary', 'name',12,'shop','xyz','copy'] # 列表中的元素可以修改,支持增删改查
# 或 b = (['job', 'salary', 'name',12,'shop','xyz','copy']) 列表的创建会调用([])来完成
2 >>> b
3 ['job', 'salary', 'name',12,'shop','xyz','copy']
长度: len() 可以查看列表中元素的个数
1 >>> len(b)
2 3
索引:NAME[N] 可以查看元素在列表中的位置
1 >>> b[0]
2 'job'
3 >>> b[1]
4 'salary'
5 >>> b[-1] # -1就是倒数喽
6 'copy'
切片(slice) 切片指从列表中取出多个元素
1 >>> b[0:3] # 取从0到第3个元素,不包括第4个
2 ['job', 'salary', 'name']
3 >>> b[:3] # 与上面一至
4 ['job', 'salary', 'name']
5 >>> b[2:5] # 取从第3到第5个元素
6 ['name', 12, 'shop']
7 >>> b[0:-3] # 取从第1至倒数第3个元素(之间)
8 ['job', 'salary', 'name', 12]
9 >>> b[-3:] # 取倒数第3个至最后一个元素
10 ['shop', 'xyz', 'copy']
11 >>> b[1:8:2] # 取第1到最后,每隔一个取一个元素,最后:2是步长,以第隔几个元素取一个
12 ['salary', 12, 'xyz']
13 >>> b[::2] # 从头到尾每隔一个取一个
14 ['job', 'name', 'shop', 'copy']
增加:NAME.append() 在列表后添加一个元素
1 ['job', 'salary', 'name', 12, 'shop', 'xyz', 'copy']
2 >>> b.append('sese')
3 >>> b
4 ['job', 'salary', 'name', 12, 'shop', 'xyz', 'copy', 'sese']
删除1:NAME.pop() 删除列表中最后一个元素
1 >>> b.pop()
2 'sese'
3 >>> b
4 ['job', 'salary', 'name', 12, 'shop', 'xyz', 'copy']
删除2:NAME.remove() 删除列表中一个元素,如果有相同元素,从左向右删除
1 >>> b.remove('xyz')
2 >>> b
3 ['job', 'salary', 'name', 12, 'shop', 'copy']
删除3:del NAME[索引]
1 >>> del b[3:7] # 删除3到7的元素(不包括7)
2 >>> b
3 ['shop', 'salary', 'name', 'copy', 'NAME', 12]
修改:NAME.insert(索引,新值 ) 修改目标位置的元素
1 >>> b
2 ['job', 'salary', 'name', 12, 'shop', 'copy']
3 >>> b.insert(3,'NAME')
4 >>> b
5 ['job', 'salary', 'name', 'NAME', 12, 'shop', 'copy']
查询:NAME.index() 查询元素在列表中的索引位置
1 >>> b.index('shop')
2 5
联结:‘’join
1 >>> name_list
2 ['xiaohua', 'xiaoming', 'old', 'yound', 'boy', 'doudou']
3 >>> '_'.join(name_list) # join 用来指定列表内元素的联结方式,只对字符串生效
4 'xiaohua_xiaoming_old_yound_boy_doudou'
包含:''in
1 >>> 'doudou' in name_list
2 True # in 返回一个bool值,多用来做判断
统计:NAME.count() 统计元素在列表中的个数
1 >>> b.append('copy')
2 >>> b.count('copy')
3 2
合并:NAME.extend(NAME2) 将列表2合并到列表1中
1 >>> b1 = ['haha','heihei']
2 >>> b .extend(b1)
3 >>> b
4 ['job', 'salary', 'name', 'NAME', 12, 'shop', 'copy', 'copy', 'haha', 'heihei']
排序:NAME.sort()
1 >>> b
2 ['job', 'salary', 'name', 'NAME', 12, 'shop', 'copy', 'copy', 'haha', 'heihei']
3 >>> b.sort()
4 >>> b
5 [12, 'NAME', 'copy', 'copy', 'haha', 'heihei', 'job', 'name', 'salary', 'shop']
反转:NAME.reverse()
1 >>> b
2 [12, 'NAME', 'copy', 'copy', 'haha', 'heihei', 'job', 'name', 'salary', 'shop']
3 >>> b.reverse()
4 >>> b
5 ['shop', 'salary', 'name', 'job', 'heihei', 'haha', 'copy', 'copy', 'NAME', 12]
循环: for
1 #!/usr/bin/env python
2 # coding:utf-8
3
4 name_list = ['xiaohua','xiaoli','xiaoping']
5 for item in name_list:
6 if item == 'xiaohua':
7 print 'yuanlaizoushiniya!'
8 continue # 当次循环不再继续
9 elif item == 'xiaoli'
10 print 'shaobing'
11 break # 退出循环
12 else:
13 pass # 写也可以,不写也可以
5、元组(tuple)
1 >>> name_tuple = (12,14,15,16,18) # 元组里的元素一旦初始化后,但不能修改
2 >>> name_tuple
3 (12, 14, 15, 16, 18)
4 >>> name_tuple = tuple((12,14,15,16,18))
5 >>> name_tuple
6 (12, 14, 15, 16, 18)
索引/切片
1 >>> name_tuple[0]
2 'xiaohua'
3 >>> name_tuple[0:]
4 ('xiaohua', ['old', 'age', 14])
长度: len()
1 >>> name_tuple = ('xiaohua',['old','age',14])
2 >>> name_tuple
3 ('xiaohua', ['old', 'age', 14])
4 >>> len(name_tuple)
包含:in
1 >>> 'age' in name_tuple
2 False
循环:for 与列表中的循环一样
6、字典(dict)
1 # 字典使用key/value的格式来存储数据,每一个key/value是一个键值对,键值对是唯一的,字典支持增删改查
2 >>> name_dict = {'name':'xiaoping','age':18,'job':'it'}
3 >>> name_dict
4 {'job': 'it', 'age': 18, 'name': 'xiaoping'}
items()/keys()/values()
1 #!/usr/bin/env python
2 # coding:utf-8
3
4 name_dict = {'name':'xiaoping','age':18,'job':'it'}
5
6 for k,v in name_dict.items(): # .items() 表示字典里所有的元素
7 print k,v
8 name_dict = {'name':'xiaoping','age':18,'job':'it'}
9 print name_dict.keys() # .keys() 表示字典里所有的key
10 name_dict = {'name':'xiaoping','age':18,'job':'it'}
11 print name_dict.values() # .values() 表示字典里所有的value
字典是无序输出的
1 tom@python:/data/python/day1$ python dict.py
2 job it
3 age 18
4 name xiaoping
五、运算
六、文件的基本操作
过程:
找到文件--打开文件--文件操作(读/写)--关闭文件
使用方式:
1 open/file(PATH,MODE)
模式:
1 r, 只读,以只读的方式打开文件,读取内容。
2 w, 只写,如果文件已经存在,会将文件覆盖,如果不存在,将会创建新文件。
3 a, 追加,如果文件已经存在,内容会追加到末尾,如果不存在,将会创建新文件。
4 w+, 读写,如果文件已经存在,会将文件覆盖,如果不存在,将会创建新文件。
读取
1 read() # 一次性全部读入内存
2 readlines() # 逐行读入内存
3 for line in FILE: # 每次循环,只读一行
read() 全部读入到内存
1 file_obj = file('/data/python/day1/tt.txt','read')
2 print file_obj.read()
3 file_obj.close()
4 # 输出
5 tom@python:/data/python/day1$ python file.py
6 job,12,home
7 copy,sel,45
readlines()逐行读取入到内存。
1 file_obj = file('/data/python/day1/tt.txt','read')
2 print file_obj.read()
3 file_obj.close()
4 #输出后是一个列表,每个元素后面都带一个换行符
5 tom@python:/data/python/day1$ python file.py
6 ['job,12,home\n', 'copy,sel,45\n']
写入
1 write_list.write() # 可以一次性写入
2 write_list.writelines() # 也可以逐行写入
write()例子
1 write_obj = file('./name.txt','w')
2 write_obj.write(str_list)
3 write_obj.close()