本博客在持续更新
为什么是Pyhton
一门计算机语言,不可能无缘无故去学习,学习,当然是因为有用。
一般来说,做网站用PHP,因为PHP开发速度快
做服务使用C/C++,因为运行速度快,稳定
写病毒、写脚本、服务?那就用Python了,因为开发速度快,而且在各个*Unix
平台上都可以运行。
当然咯,如果你准求更快的性能,写服务可以使用C/C++,但更多的时候是用不到,C的学习更多是为了学习Linux本身。
所以说,如果你想学习运维,请选择python;如果你想当黑客,选择python;如果你想学习AI,选择python!
Python的版本
Python目前有两个重要的版本:2.7 和 3.X。目前大多数的linux系统默认都是安装2.X,但推荐学习3.X
这3.X并不兼容2.7.X,但也差不了太多。pytho2和python3有少量区别,请看这里
安装
$ sudo yum install python34
$ python3 -V
Python 3.4.5
编辑器
1.pyCharm
pyCharm是jetbrains公司的python编辑器,该公司的编辑器有php、python、java等多个类型,而且有其他很多的牛逼软件。
2.vi
vi用来临时编写少量的python脚本还是很有用的,但是作为工程性项目就不行了,还是pycharm方便。
hello world脚本
hello.py :
#!/usr/bin/env python
print ("Hello World")
添加执行权限,执行:
$ chmod +x hello.py
$ ./hello.py
$ Hello World
#!/usr/bin/env python
会调用python解析器,#!/usr/bin/env python
比#!/usr/bin/python
兼容性更好 ,不管python在哪里安装,只要在PATH目录里面就可以调用.
python2中文乱码
如果脚本中有非ASCII字符,需要声明uft-8编码:
#!/usr/bin/env python
#coding=utf-8
print "你好世界"
或
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
print "你好世界"
我喜欢#coding=utf-8
,懒 ):
在Python 3中,非-ASCII 标识符也是允许的了,包括中文
语法
1.标识符
区分大小写、由数字、字母、下划线组成,字母开头。下划线也是字母,C创始者说的。
2.关键字
python内置keyword模块,可以查看当前版本的关键词有哪些:
$ python3
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
3.注释
单行注释#
#!/usr/bin/python3
# 第一个注释
# 第二个注释
print ("Hello, Python!")
多行注释:
#!/usr/bin/env python3
'''
1111111111111111
222222222222
33333333333333
'''
4.神奇的代码块缩进
和中国特色相媲美的是,python的强制缩进!
同一代码块内部,每一行代码都必须缩进一样的格式:可以都是tab,可以都是4个空格或其他
if True:
print ("True")
else:
print ("False")
5.续行符 \
如果代码太长,可以使用续行符 \
:
total = 100+ \
200+ \
300
6.空行
python中,建议同一层级的代码块之间有空行
#!/usr/bin/env python3
dict={
'title':'国务院开会',
'desc':'今天下午国务院召开...'
}
for key in dict:
print (key);
print (dict[key])
print (dict)
7.数字类型
python不愧是数学家发明的,数字类型完全和数学一样啊:整数、长整数、浮点数和复数。
整数, 如 1
长整数 是比较大的整数
浮点数 如 1.23、3E-2
复数 如 1 + 2j、 1.1 + 2.2j
数字类型和数据类型不一样哦,数据类型除了数字,还包括字符串等其他数据类型
变量
python是弱类型语言,定义方式极为简单,变量只有赋值了才算定义,和php是一样的。
1.赋值的三种方式
a=1 #定义一个变量,值为整型数1
a,b=1,'2' # 相当于 a=1;b=2;
a=b=1 # b=1;a=b;
2.注销变量
a,b=1,2;
del a;
3.命令结束符
和其他语言一样,Python默认以换行符作为命令结束符,使用分号;
也可以表示一个命令的结束。
a=1;b=2
4.几种变量赋值的方式
下面是Python几种变量赋值的方式,其中方式1是Python特有的,其他的方式在各种语言上大都支持。
#方式1
a,b=1,2
#方式2
a=1
b=2
#方式3
a=b=1;
#方式4
a=1;b=2
数据类型
六大数据类型
数字、列表、元组、字符串、字典、集合
其中:
列表、元组、字符串是有序的
字典和集合是无序的
注意:在 Python2 中是没有布尔型的,它用数字 0 表示
False,用 1 表示 True。到 Python3 中,把 True 和 False 定义成关键字了,但它们的值还是 1 和 0,它们可以和数字相加。
type() 和isinstance
>>> type(1)
<class 'int'>
>>> isinstance(1,int)
True
type() 不承认继承,不会认为子类是一种父类类型。
isinstance()承认继承,会认为子类是一种父类类型。
isinstance()承认继承返回布尔值,type()返回字符串
列表
#!/usr/bin/env python3
list = [ 'abcd', 786 , 2.23, 'runoob', [1,2,3]]
print (list);
顾名思义,列表就是1个或者多个数据的有序结合,内容可以是任何数据类型。
列表的四大金刚
#!/usr/bin/env python3
list1 = [ 'abcd', 786 , 2.23, [1,2,3]]
list2 = [[1],786]
print ("输出完整列表: ",list1); #输出完整列表
print ("输出列表第一个元素: ",list1[0]); #输出列表第一个元素
print ("输出列表第一个元素到倒数第2个: ",list1[0:-2]); #输出列表第一个元素到倒数第2个
print (list1+list2); #拼接
因为列表是有序的,所以可以允许有多个相同的值!
[1,1,1]
修改元组内容:
#!/usr/bin/env python3
list = [1,2,3]
list[0] = 4
print (list) #[4,2,3]
元组
元组就是只读的列表,不可以修改
#!/usr/bin/env python3
list = (1,1,2)
print (list)
print (list[0])
#!/usr/bin/env python3
tuple = (1,2,3);
tuple[0]= 2; #报错!!!!!!!!!!
print (tuple);
但是我们可以这样:
#!/usr/bin/env python3
tuple = (1,2,[3])
tuple[2][0] = 'a' #可以改里面的列表、字典、集合、数字等
print (tuple)
字符串
1.字符串定义
String(字符串)
Python中的字符串用单引号(‘)或双引号(“)括起来,同时使用反斜杠()转义特殊字符。
python中单引号和双引号使用完全相同
python允许处理unicode字符串,加前缀u或U, 如 u”this is an unicode string”。
'你好'
"你好"
'''
你
好
'''
2.字符串截取
print (str[0:-1]) # 输出第一个到倒数第二个的所有字符
print (str[0]) # 输出字符串第一个字符
print (str[2:5]) # 输出从第三个开始到第五个的字符
3.字符串连接
逗号,
的连接方式会产生空格
#!/usr/bin/env python3
print('hello''world'); #helloworld
print('hello'+'world'); #helloworld
print('hello',' world'); #hello world,产生空格
r 原样字符
python的这个功能太赞了,妈妈再也不用担心我的字符会被转义了:
r"a\tb" #就是原样返回,\t不会被转义
print(r'hello wo\nrld'); # \n不会被转义
字典
字段就是一些列键值对数据的无序集合
#!/usr/bin/env python3
dict={
'title':'国务院开会',
'desc':'今天下午国务院召开...'
}
print(dict) # {'title': '国务院开会', 'desc': '今天下午国务院召开...'}
print(dict['title']) #国务院开会
del dict['title'] #注销字典某个项
print (dict) #{'desc': '今天下午国务院召开...'}
del dict #直销字典
序列是以连续的整数为索引,与此不同的是,字典以 关键字 为索引,关键字可以是任意不可变类型,通常用字符串或数值。如果元组中只包含字符串和数字,它可以做为关键字。而集合、字典、列表则不可以作为key,因为他们的数据量是可变的。
集合
集合可以当成是字典的特例,只是key是从0开始,一次加1的
当然,两者并不相等
#!/usr/bin/env python3
dict={
'title':'国务院开会',
'desc':'今天下午国务院召开...'
}
print(dict) # {'title': '国务院开会', 'desc': '今天下午国务院召开...'}
print(dict['title']) #国务院开会
del dict['title'] #注销字典某个项
print (dict) #{'desc': '今天下午国务院召开...'}
del dict#直销字典
要创建空集合,你必须使用 set() 而不是 {}。后者用于创建空字典
数据类型转换
print()函数
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=”“:
模块引用
引用模块:
import 模块名引用模块中某个函数:
from 模块名 import 函数引用模块中多个函数:
from 块 import firstfunc, 函数1,函数2,。。。
引入模块
#!/usr/bin/env python3
import sys
print('================Python import mode==========================');
print ('命令行参数为:')
for i in sys.argv:
print(i,end="");
print("");
引入模块函数,属性
from sys import argv,path # 导入特定的成员
print('==== ===python from import====== ===')
print('path:',path) # 因为已经导入path成员,所以此处引用时不需要加sys.path
pip
python默认的包管理器
安装
https://pip.pypa.io/en/stable/installing/
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
pip -V
更新
pip install -U pip
pip -V
面向对象
在看其他人写的UDP扫面工具的时候,很多面向对象的写法都不太理解,特意过一遍
这部分采用2.7版本的代码
参考资料:
廖雪峰Python2.7教程
Python菜鸟
例子
#!/usr/bin/env python
#coding=utf-8
class Student:
tag='好学生'
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print '%s: %s' % (self.name,self.score)
def setTag(self,msg) :
Student.tag = msg
def print_tag(self):
print '%s' % (Student.tag)
xiaoming = Student('xiaoming',55)
xiaowang = Student('xiaowang',59)
xiaoming.print_score()
xiaoming.print_tag()
xiaoming.setTag('坏学生')
xiaowang.print_score()
xiaowang.print_tag()
- 需要使用关键字
class
定义类 __init__
是类的构造函数,在new对象的时候自动执行 每个方法都必须有- 一个参数self,表示当前对象。这个和php、JS的this一样的道理 Python
- 造对象不需要new关键字
变量tag
是类的静态变量,所有对象共享,因此当xiaoming修改之后,xiaowang也就变成了坏学生
提示:
关键在于对面向对象编程的理解,而其中的面向对象语法,做几个项目自然就熟练了
封装
#!/usr/bin/env python
#coding=utf-8
class Student:
tag='好学生'
def __init__(self, name, score):
self.name = name
self.score = score
xiaoming = Student('小明',55)
xiaowang = Student('小王',59)
print xiaoming.name #小明
默认情况下,Python的属性和方法都是公开的,在任何地方都可以调用,我们可以通过给属性添加下划线,将其声明为私有
#!/usr/bin/env python
#coding=utf-8
class Student:
tag='好学生'
def __init__(self, name, score):
self.__name = name
self.score = score
xiaoming = Student('小明',55)
xiaowang = Student('小王',59)
print xiaoming.__name #小明
在类外面访问私有变量:
在Python里面,任何属性、方法都可以访问,包括私有的。只不过命名为私有变量的时候,实际的变量名变了而已,我们可以使用dir()函数打印当前对象有哪些属性和方法
#!/usr/bin/env python
#coding=utf-8
class Student:
tag='好学生'
def __init__(self, name, score):
self.__name = name
self.score = score
def __run__(self):
print '跑跑跑'
xiaoming = Student('小明',55)
xiaowang = Student('小王',59)
print dir(xiaoming)
打印属性和方法列表:
['_Student__name', '__doc__', '__init__', '__module__', '__run__', 'score', 'tag']
我们可以使用
xiaoming._Student__name
在外面访问__name
属性,当然了,这不总是有效,不同的Python编译器采用不用的变化规则。
访问私有变量的建议:
一般来说,如果需要访问或者设置私有变量,我们建议定义get或者set方法,这样,我们可以在方法中对传入的值进行检查、处理
#!/usr/bin/env python
#coding=utf-8
class Student:
tag='好学生'
def __init__(self, name, score):
self.__name = name
self.score = score
def getName(self):
return self.__name
def setName(self,name):
self.__name = name
xiaoming = Student('小明',55)
xiaowang = Student('小王',59)
print xiaoming.getName()
xiaoming.setName('大明')
print xiaoming.getName()
继承
多态
类型检查和转换
我们定义的类和Python内置类没有任何区别,很多情况下,我们都需要检查数据的类型,比如是不是字符串、整数,或者某个类的对象等,然后,我们还可能需要进行转换