1:python 的优缺点
Python 的哲学就是简单优雅。尽量写简单的代码
python 适合开发 网站 后台服务 以及日常用到的小工具 系统管理员需要用到的脚本等等
python 运行的速度相对于别的语言来说较慢 并且Python的代码不能够加密
2:Python的安装
在官网上下载Python2.7版本 然后安装 将安装后的python.exe的路径配置到环境变量中。在cmd中运行Python 查看是否配置成功。
3:Python的不同解释器
由于Python语言从规范到解释器都是开源的,所以也就存在很多的解释器。
CPython 官方解释器 提示符是<<< 最广泛
IPython 基于CPython的一个交互式解释器 提示符 In[序号]:
PyPy 采用jlt技术 对PYTHON 代码进行动态编译 提高速度 与CPython 存在一些区别 可能导致python 代码的运行结果不相同
Jpython java 平台上的解释器,可以直接把python 编译成java的字节码
IronPython .NET上的Python解释器。
4.Python的交互式环境的应用。
1:Python的交互式环境下的数字计算
>>>100+200
300
>>>
2:Python打印输出
>>>print "Hello World!"
>>>Hello World
在Python的交互式环境下 可以直接输入代码然后得到结果。当然这样是没有办法保存代码的,只能一次使用 ,书写Python的时候绝对不要使用windows自带的记事本 因为其会增加多余的字符 导致解释出现错误
5:Python的I/O
print 加上字符串 多个字符串之间用 , 连接 Python遇到‘,' 逗号 会输出空格
print 'hello world'
print 'I','love','you'
print 打印整数
>>>print 300
300
>>>print '100+200 =',100+200
100+200 = 300
raw_input() 让用户输入字符串 并将其保存在变量中
>>>name = raw_input()
Michael
>>>name
'Michael'
二: python 基础
1:Python语言采用缩进方式 缩进最好使用4个空格来进行 大小写敏感
2:Python的注释 #
3:当语句以 : 结束时 缩进的语句视为代码块。
5:数据类型和变量:
整数,浮点数,字符串(r'' 两个引号之间的内容不发生转义 '''...''' 表示多行内容) ,布尔值(and or not ),空值None
在Python中同一个变量可以反复的赋值 而且可以使不同类型的变量
a=123#a是整数
print a
a='ABC'
print a#a是字符串
这种变量本身的类型不固定的语言叫做动态语言,
a='ABC' Python解释器干了两件事: 1:在内存中创建一个'ABC'的字符串 2:在内存中创建一个名为a的变量 并把它指向'ABC'
因此:
a='ABC'
b=a
a='XYZ'
print b
打印的结果是'ABC'
6:常量
Python中通常使用全部大写的变量名表示常量
7:字符串和编码
1: ord() 和chr()函数 可以将对应的数字和字母转换 ,Python最早的版本只支持ASCII编码
<span style="white-space:pre"> </span>>>>ord('A')
65
>>>chr(65)
'A'
2:python 后来增加了对Unicode的支持 以Unicode表示的字符串用u'.....'表示
>>>print u'中文'
中文
>>>u'中'
u'\u4e2d'
3:想要输出中文 必须使用Unicode 编码 或者UTF-8编码
>>>u'ABC'.encode('utf-8')
'ABC'
>>>u'中文'.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87' 中文转换后将变为3个字符
4:len() 函数得到字符串的长度
5: decode('utf-8') 将utf-8编码的字符串转换成Unicode编码
6:在保存源文件的时候通常这样写:
#!/usr/bin/env python 告诉Linux系统这是一个Python可执行程序
# -*- coding:utf-8 -*- 告诉Python编译器 按照utf-8编码读取源代码
7:Python字符串的格式化(在Python中格式化方法与C语言中是一致的用%实现)
>>>'Hello,%s' % 'World'
'Hello,World'
>>>'hi,%s,you have $%d' %('zhuyu',10000)
'hi,zhuyu,you have $10000'
%d 整数 %s字符串 %f 浮点数 %x十六进制整数
8:使用list和tuple
1:list 是Python内置的数据类型 列表 list是一种有序的集合 可以随时添加和删除其中的元素
>>>classmates=['xxb','xxw','lyd']
>>>classmates
['xxb','xxw','lyd']
len()函数可以获取list集合元素的个数
>>>len(classmate)
3
python 中使用下标 或者索引来访问list中的元素 相当于使用数组 需要保证下标不要越界
>>>classmates[1]
'xxw'
python 中访问list元素不仅仅可以正向下标访问 而且还可以逆向下标访问 第一个元素的下标为-1
>>>classmates[-2]
'xxw
list 是一个可变的有序的列表 所以可以往list中追加元素到末尾 使用 append()函数
>>>classmates.append('lc')
>>>classmates
['xxb','xxw','lyd','lc']
同时list还可以把一个元素插入到指定的位置 比如索引号为1的位置:使用insert(n,x) 方法
>>>classmates.insert(1,xx)
>>>classmates
['xxb','xx','xxw','lyd','lc']
删除list 末尾的元素 可以使用pop()
>>>classmates.pop()
'lc'
>>>classmates
['xxb','xx','xxw','lyd']
删除指定位置的元素 使用 pop(i) i 为元素位置的索引
>>>classmates.pop[1]
'xx'
>>>classmates
['xxb','xxw','lyd']
元素替换 直接赋值 覆盖掉就可以 classmates[1]='lc'
>>>classmates[1]='lc'
>>>classmates
['xxb','lc','lyd']
注意哦:list 中的元素可以有重复的值 并且list元素中的数据类型可以不相同
>>>classmates.append(12)
>>>classmates
['xxb','lc','lyd',12]
list 中的元素也可以是一个list的类型
>>>s=['python','java',['asp','php'],'scheme']
>>>len(s)
4
>>>p=['asp','php']
>>>s=['python','java',p,'scheme']
获取到 'asp' 可以是 s[2][1]
>>>s=['python','java',['asp','php'],'scheme']
>>>len(s)
4
>>>p=['asp','php']
>>>s=['python','java',p,'scheme']
获取到 'asp' 可以是 s[2][1]
2:python 的 tuple 有序列表 元组 tuple 和list 相似 但是
tuple 一旦初始化后就不可以修改了。
>>>classmates=('xxb','xxw','lc')
>>>classmates=('xxb','xxw','lc')
classmates 是一个tuple 类型 其不可以在进行修改 没有append() insertI() 等方法 其他方法和list 一样 但是不可以赋值
不可变的tuple使代码更加 的安全 因此 可以使用tuple的尽量使用tuple
tuple 陷阱:当你定义的时候 tuple 的元素就必须被确定下来 比如
>>>t=(1,2)
>>>t
(1,2)
如果要定义一个空的tuple 则
</pre><div style="font-family: 微软雅黑; font-size: 14px; line-height: 21px;"><pre name="code" class="html"> >>>t=()
>>>t
()
但是 要定义一个只有一个元素的tuple ,如果你这么定义
>>>t=(1)
>>>t
1
定义的不是tuple 而是1 这个数 这是因为()既可以表示tuple 也可以表示算术运算中的小括号 产生了歧义 所以定义一个的时候必须加上一个 ,
>>>t=(1,)
>>>t
(1,)
一个可变的tuple:
>>>t=('a','b',['A','B'])
>>>t[2][0]='X'
>>>t[2][1]='Y'
>>>t
('a','b',['X','Y'])
3:list 和tuple都是Python中的有序集合 一个可以变 一个元素不可以变 ,可以使用tuple的时候尽量使用tuple 因为元素不可变相对来说 安全
9:条件判断和循环
1:条件判断
if elif else 不要忘记: 和缩进规则(4个空格)
if 条件判断1 :
执行1
elif 条件判断2:
执行2
elif 条件判断3:
执行3
else:
执行4
age=20
if age>=6:
print 'teenager'
elif age>=18:
print 'adult'
else
print 'kid'
2:循环
python 有两种循环 一种是
for...in 循环 依次把 list或者tuple 中的每一个元素迭代出来
names=['lc','xxw','xxb']
for name in names:
print name
结果
lc
xxw
xxb
python 内置 range() 函数 可以生成一个整数序列 比如 range(5) 生成的序列是从0开始 小于5的整数
第二种循环是 while 循环 只要条件满足就不断的进行循环 比如计算100以内的所有奇数之和
sum=0
n=99
while n>0:
sum=sum+n
n=n-2
print sum
3:在议 raw_input 函数
raw_input()读取的内容永远是字符串的形式返回的 因此想要读入的是一个整数 需要进行int() 强制转换
10:dict 和set
1:dict Python内置的字典 相当于其他语言中的map 使用键值对的方式存储 具有极快的查找速度
>>>d={'xxb':99,'lc':89,'xxw':78,'lyd':67}
>>>d['xxb']
99
可以通过key 讲一个键值对放入到dict 中
>>>d['sjm']=78
>>>d['sjm']
78
可以通过 in 判断 key 是否存在
>>>'ddd' in d
false
也可以通过 dict 的get方法返回值判断 如果不存在则放回None (None 在交互式中不显示) get('ddd',-1)如果不存在返回-1
>>>d.get('ddd')
>>>d.get('ddd',-1)
-1
删除一个键值对可以通过 pop(key)来实现 对应的value也将会从dict 中删除
>>>d.pop('sjm')
78
>>>d
{'xxb':99,'lc':89,'xxw':78,'lyd':67}
注意:dict 的key 必须是不可以变化的对象 例如整数 字符串都是不可以变的 但是不可以用list做key 因为list 是可以变的 dict是无序的 并且dict的key值不可能相同。
2:set
set 与dict类似 也是一组key 的集合 但是不存储value 由于key 不重复 所以set 也是不重复的 并且set也是无序的
要创建一个set 需要提供一个list 作为输入集合
>>>s=set([1,2,3])
>>>s
set([1,2,3])
set 中重复的值将会被过滤掉
>>>s=set([1,2,3,3,3])
>>>s
set([1,2,3])
通过add(key) 方法可以添加元素到set中 可以重复添加 但是会被覆盖
>>>s.add(4)
>>>s
set([1,2,3,4])
通过remove(key)可以删除元素
>>>s.remove(1)
>>>s
set([2,3,4])
set 可以做数学意义上的交集并集等操作
>>>s1=set([1,2,3])
>>>s2=set([2,3,4])
>>>s1&s2
set([2,3])
>>>s1|s2
set([1,2,3,4])
三:函数
abs() 去绝对值
1:定义函数
def my_abs(x):
if x>=0:
return x
else:
return -x
2:空函数
def nop():
pass
pass 语句什么也不做 pass 可以用来做占位符 比如现在还没有想好怎么写函数的代码 就可以先放一个pass让程序先跑起来
3:参数检查
调用函数的时候 如果参数个数不对 Python解释器会自动检查出来 并抛出一个typeError: 但是如果参数类型不对 Python解释器就无法帮我们检查
def my_abs(x):
if not isinstance(x,(int,float)):
raise TypeError('bad operand type')
if x>=0:
return x
else
return -x
4: 返回多个值 在Python语言中可以放回多个值
import math
def move(x,y,step,angle=0):
nx=x+step*math.cos(angle)
ny=y-step*math.sin(angle)
return nx,ny
这样就可以同时返回多个返回值
>>>x,y=move(100,100,60,math.pi/6)
>>>print x,y
151.961524227 70.0
其实python 返回的仍然是一个值 只是Python将其 封装到了tuple 中 然后在拆分。
>>>r=move(100,100,60,math.pi/6)
>>>print r
(151.961524227,70.0)
5:函数的参数
1:默认参数 (必选参数在前 默认参数在后 否则Python的解释器会报错 默认参数必须指向不变对象)
2:可变参数(函数的参数个数是可变的)
仅仅需要在参数前边加上一个 * 就可以 在list tuple前面加上一个* 可以吧list或者tuple中的元素当做可变的参数传入到函数中
def calc(*numbers):
sum=0
for n in numbers:
sum=sum+n*n
return sum
>>>calc(1,2)
5
>>>calc()
0
>>>nums=[1,2,3]
>>>calc(*nums)
14
3:关键字参数
可变参数允许传入一个或任意个参数,这些可变参数在函数调用时后自动封装为一个tuple 而关键字参数允许你传入0个或任意个含参数名的参数 这些关键字参数在函数内部自动封装成一个dict
def person(name,age,**kw):
print 'name:',name,'age:',age,'other:',kw
>>>person('lc',21)
name: lc age: 21 other: {}
>>>person('xxw',21,city='zhejiang')
name:xxw age:21 other:{'city':'zhejiang'}
4:参数组合
顺序必须是 必选参数 默认参数 可变参数 关键字参数
def func(a,b,c=0,*args,**kw):
print 'a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw
>>>func(1,2)
a=1 b=2 c=0 args=() kw={}
>>>func(1,2,c=3)
a=1 b=2 c=3 args=() kw={}
>>>func(1,2,3,'a','b')
a=1 b=2 c=3 args=('a','b') kw={}
>>>func(1,2,3,'a','b',x=1)
a=1 b=2 c=3 args=('a','b') kw={'x':1}
>>>args=(1,2,3,4)
>>>kw={'x':1}
>>>func(*args,**kw)
a=1 b=2 c=3 args=(4,) kw={'x':1}
5:小结:
默认参数一定是不可变参数 否则运行的时候会发生逻辑错误
*args 是可变参数 args接受的是一个tuple(有序集合 初始化后就不可以变化)
**kw 是关键字参数 kw 接受的是一个dict (相当与map)
可变参数可以直接传入 func(1,2,3) 又可以先封装成list 或者tuple 在通过*args传入
关键字参数可以直接传入 func(x=1,u=2)又可以先封装成dict在通过**kw 传入
6:递归函数
四:高级特性
1:切片(取一个list或者tuple的部分元素)
>>>l=['lc','xxw','xxb','lyd','sjm']
去前三个元素
>>>l[0:3]
['lc','xxw','xxb']
l[0:3]表示从索引0开始取 知道索引3为止 但不包括索引3 也就是 0 1 2 也可以简写成 l[:3]
>>>l[1:3]
['xxw','xxb']
>>>[-2:]
['lyd','sjm']
字符串也是也可以看成是一种list
>>>'abcdefg'[:3]
'abc'
>>>'abcdefg'[::2]
'aceg'
第三个参数表示步长 也就是每隔几个取一个
2:迭代(给定一个list或者tuple 我们通过for循环来遍历这个list或者tuple 这种遍历我们称之为迭代)
Python中迭代通过 for...in 来完成
dict 默认迭代的是key 如果要迭代value 可以用 for value in d.itervalues() 如果迭代key 和value 则可以通过 for key,value in d.iteritems()
3:列表生成器(Python中非常简单并且强大的可以用来创建list 的生成式)
>>>range(1,11)
[1,2,3,4,5,6,7,8,9,10]
生成[1*1,2*2,3*3,4*4,...,10*10]
>>>[x*x for x in range(1,11)]
[1,4,9,16,25,36,49,64,81,100]
for 循环后面还可以加上if 判断 筛选出只有偶数的平方
>>>[x*x for x in range(1,11) if x %2==0]
[4,16,36,64,100]
可以使用多层循环 可以生成全排列
>>>[m+n for m in 'abc' for n in 'xyz']
['ax','ay','az','bx','by','bz','cx','cy','cz']
比如列出当前目录下的所有文件和目录名
>>>import os #导入os模块
>>>[d for d in os.listdir('.')]# os.listdir 可以列出文件和目录
[...]
isinstance(x,str) 判断一个变量是不是字符串 isinstance()方法判断一个变量是不是指定的类型
4:生成器(列表很大的时候可能占用很大的内存 也可能造成浪费 如果列表中的元素可以通过某种算法计算出来 则可以不用创建完整的list 而是一边循环一边计算 这种机制叫做生成器)
创建generator 第一种方法是将 列表生成式的[] 变为()
>>>L=[x*x for x in range(10)]
>>>L
[0,1,4,9,16,25,36,49,64,81]
>>>g=(x*x for in range(10))
>>>g
<generator object <genexpr> at 0x10293a0d>
使用next() 方法打印generator的每一个元素
>>>g.next()
0
>>>g.next()
1
例如斐波拉契数列
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,a+b
n=n+1
这是定义generator的另一种方法 如果函数定义中包含yield 关键字 那么这个函数就不在是一个普通的函数 而是一个generator
>>>fib(6)
<generator object fib at 0x90a0d0c09>
generator 和函数的执行流程不一样 函数是顺序执行 遇到return语句或者最后一行函数语句就返回 而generator的函数 在每次调用next()的时候执行 遇到yield的时候返回再次执行的时候从上次返回的yield语句开始执行