教程地址:python入门 - 慕课网
安装python 执行脚本
安装程序,并将python.exe加入系统环境变量。
记得配置完环境变量后要重新打开一个cmd,不然不起作用啊,好气
配置下sublime可以直接执行python脚本吧。
Sublime text工具-编译系统-自动就好了ctrl+b执行脚本
数据类型
1.整数
a)200,-10,0
b)二进制(1010),八进制(0777),十进制(444),十六进制(0x45af)这些。
c)八进制表示数字前必须加上0(零),十六进制表示数字前必须加上0x.
2.浮点数
a)0.7 -0.56 0.0004
b)科学计数法1.23*10^9 => 1.23e9 0.000012 => 1.2e-5
3.字符串
a)‘abc’ “abc”
b)‘ab”c’ “ab’c” “ab\”c”(\为转义符)
4.布尔值
a)Ture (真)
b)False (假)
c)布尔值可以用and、or和not运算。其实就是与或非
5.空值
a)空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。
b)print(0==None) #False
Print语句
在3.6中print语句要使用()包起来,而2.7则不需要。
都可以使用,(逗号)分隔,打印多个结果
print('100 + 200 =', 100 + 200)
注释#
Python的注释以#开头,后面的文字直到行尾都算注释
#我是一行注释....
变量
Python的声明变量与php声明变量一样简单,都不用指定变量的数据类型,而且不需要php的$符号
和大多数语言一样,变量名由字母数字下划线组成,且不能以数字开头
例子
a = 'ABC'
b = a #这里的赋值是值传递
a = 'XYZ'
print (b,'\n') #ABC
对比php中则存在通过加&符引用传递
raw字符串
使用r开头,表示这是一个raw字符串,里面的字符不需要转义
r'\(~_~)/ \(~_~)/'
多行字符串‘’’...’’’
'''Line 1
Line 2
Line 3'''
python中的整形和浮点型
在2.7版本中,整数之间相除为整数,不会保留小数点,只取整。11/4 = 2
在我使用的3.6版本中就不存在这个问题。11/4 = 2.75
python中的布尔类型
Python把0、空字符串''和None看成False,其他数值和非空字符串都看成True
Python中的and,or,not就是对应php中的&&,||,!,且存在短路原则。
a = True
print(a and 'a=T' or 'a=F') #a=T
列表list
List是一种有序的集合,使用[],将元素括起来,没有元素就表示一个空list
创建list :L = ['Adam', 'Lisa', 'Bart']
与大多数语言一样,列表list的索引是从0开始的,可以通过 变量[索引] 来访问list中的元素
通过索引访问list : print(L[1]) #Lisa
访问不存在的索引就会报错
倒序访问list : print(L[-1]) #Bart
倒序访问list : print(L[-2]) #Lisa
一样越界会报错: print(L[-4]) #报错
往list列表添加新元素
append()方法 将新元素追加到list末尾
L.append('Paul')
print(L) #['Adam', 'Lisa', 'Bart', 'Paul']
Insert()方法,它接受两个参数,第一个参数是索引号,第二个参数是待添加的新元素
当参数1索引存在的时候,新元素被插入到指定位置,且这个索引后的元素,索引向后推一位。
当参数1索引不存在的时候,新元素就是追加在list末尾,自动分配索引
同样的,也接受负数作为倒序的索引
L.insert(100,'Paul')
L.insert(4,'test')
L.insert(-4,'test111')
print(L) #['Adam', 'test111', 'Lisa', 'Bart', 'Paul', 'test']
从list列表删除元素
使用pop()方法,当不给pop方法传递索引时,默认删除list中的最后一个元素(其实就是默认-1)
传入索引,则根据索引查找,并删除
pop()方法会返回被删除掉的元素
L = ['Adam', 'Lisa', 'Bart', 'Paul']
print(L.pop()) #Paul
print(L) #['Adam', 'Lisa', 'Bart']
print(L.pop(0)) #Adam
print(L) #['Lisa', 'Bart']
print(L.pop(-2)) #Lisa
print(L) #['Bart']
索引越界会直接报错。pop()删除空list里面元素的时候同样会报错
替换list中的元素
其实就是给指定的索引赋值,越界报错,可以使用负数索引
L[-1] = 'Paul'
元组tuple
tuple是另一种有序的列表,tuple使用()把元素括起来。tuple 和 list 非常类似,但是,tuple一旦创建完毕,就不能修改了。
创建tuple :t=('Adam', 'Lisa', 'Bart')
Tuple与list一样,可以通过索引访问:
t = ('Adam', 'Lisa', 'Bart')
print(t) #('Adam', 'Lisa', 'Bart')
print(t[1]) #Lisa
print(t[-3]) #Adam
创建单个元素的tuple
因为()既可以表示tuple,也可以表示运算时的优先级,所以类似这样的时候存在歧义。
t = ('string') #string
t = (10086) #10086
正是因为用()定义单元素的tuple有歧义,所以 Python 规定,单元素 tuple 要多加一个逗号“,”,这样就避免了歧义:
t = ('string',)
print(t) #('string',)
“可变”的tuple
t = ('a', 'b', ['A', 'B'])
L = t[2]
L[0] = 'X'
L[1] = 'Y'
print(t) #('a', 'b', ['X', 'Y'])
指向不变:tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
Python代码的缩进
具有相同缩进的连续代码行被视为代码块。没有像php那种{}
Python的习惯写法:4个空格,不要使用Tab,更不要混合Tab和空格
If语句
if条件:
代码块
If-else
if条件:
代码块
else:
代码块
If-elif-else
if条件:
代码块
elif :
代码块
else :
代码块
#这个elif就是指else if的意思。
总体上if else这些和其他语言一样,就是注意没有{}括号,而已相同的连续缩进为代码行为代码库,以:开始代码库标识,还有else if简写为elif就是了。
for循环
list或tuple可以表示一个有序集合。可以使用for循环依次访问一个其中的每一个元素
L = ('Adam', 'Lisa', 'Bart')
for name in L:
print(name)
L = [75, 92, 59, 68]
sum = 0.0
for score in L:
sum += score
print(sum / 4)
while循环
和其他主流语言一样,都是当满足条件,执行while代码块。否则跳槽循环。
N = 10
x = 0
while x < N:
print(x)
x = x + 1
用 for 循环或者 while 循环时,如果要在循环体内直接退出循环,可以使用 break 语句。
在循环过程中,可以用 break 退出当前循环,还可以用 continue 跳过后续循环代码,继续下一次循环。
嵌套循环
在循环内部,嵌套循环。这种开发过程中是很常见的。
for x in [1,2,3,4,5,6,7,8,9]:
for y in [0,1,2,3,4,5,6,7,8,9]:
if x<y:
print(x*10 + y)
字典dict
Dict是key-value的键值对集合,使用大括号{}包裹。
创建一个dict字典,赋值给变量d:
d = {
'Adam': 95,
'Lisa': 85,
'Bart': 59
}
定义的时候,重复的key会取代上一个。还有关于这个key可以是整形,浮点型,字符串都行的。
d = {
'Adam': 95,
'Lisa': 85,
'Bart': 59,
1.5:50,
1.5:51,
'<"\'>':11
}
print(d) #{'Adam': 95, 'Lisa': 85, 'Bart': 59, 1.5: 51, '<"\'>': 11}
与list和tuple不同的是,dict通过key来访问其中的元素。
d['Adam'] #95
当key存在时,返回其对应的value,否则报keError错误
要避免KeyError 发生,有两个办法:
一是先判断一下key 是否存在,用 in 操作符:
if 'Paul' in d:
print(d['Paul'])
二是使用dict本身提供的一个 get 方法,在Key不存在的时候,返回None:
print(d.get('Bart')) #59
print(d.get('Paul')) #None
len()函数可以计算任意集合的大小,包括list,tuple,dict,字符串也行
len([1,2,3]) #3
字典dict的特点
dict是无序的。
dict中做为key的元素是不可变的,其中字符串,整数,浮点数都是不可变的,list不行,每个元素都是不可变对象的tuple也是不可变的,可以作为key。
{('a','b'):1} #可以
{('a','b',['c']):1} #不行,存在list
更新字典dict
dict是可变的,可以随时往dict中添加新的key-value
使用dict[key]=value的语法,存在则替换,不存在则添加。
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59}
d['a']='dada';
d['Bart']=100;
print(d) # {'Adam': 95, 'Lisa': 85, 'Bart': 100, 'a': 'dada'}
遍历字典dict
使用for in遍历
for key in d:
print(key,':',d[key])
#拿到key之后使用dict[key]取其对应的value
set数据类型
dict的作用是建立一组 key 和一组 value 的映射关系,dict的key是不能重复的。
只想要dict 的 key,不关心 key 对应的 value,目的就是保证这个集合的元素不会重复,set就是符合这种需求。
set 持有一系列元素,这一点和 list 很像,但是set的元素没有重复,而且是无序的,这点和 dict 的 key很像。
创建set方法:调用set()并传入一个list,list的元素将作为set的元素
s = set(['A', 'B', 'C'])
print(s) #{'A', 'C', 'B'} 元素的顺序和初始传入的不同,set是无序的,随机的
也可以直接这样:
s={'A', 'C', 'B'}
Set不能包含重复的元素,传入的重复元素会被自动去重。
访问set
由于set存储的是无序集合,所以我们没法通过索引来访问。
访问set中的某个元素实际上就是判断一个元素是否在set中。
使用in操作符判断
s={'A', 'C', 'B','B'}
print('A' in s) #True
print('a' in s) #False
更新set
使用add()方法添加元素,依然是自动去重
使用remove(key)去除key元素,key不存在时会报错。
s={'A', 'C', 'B'}
s.add('D')
s.add('A')
s.remove('C')
print(s) #{'A', 'D', 'B'}
函数
在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
return None可以简写为return
def my_sum(x,y):
return x+y
print(my_sum(3,5)) #8
函数返回多值(实际上就是返回一个tuple)
def my_sum(x,y):
return x,y,x+y
print(my_sum(3,5)) #(3, 5, 8)
python之递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
要找到规律,然后注意结束递归的条件。
def my_def(n):
n = int(n);
if n<=0:
return
if n==1:
return 1
else:
return n*my_def(n-1)
print(my_def(3)) # 3*2*1 = 6
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
函数的默认参数
函数的参数可以设置默认参数,放在参数列表后面。比如def hanshu(x,y=2,z=3)这种
与php中一样。
Python中的int()函数的第二个参数,就是参数一对应的进制,默认10进制。
不合法会报错,最终返回十进制整数。
print(int('123'))#123
print(int('123',8)) #83
print(int('1010',2)) #10
可变参数
如果想让一个函数能接受任意个参数,我们就可以定义一个可变参数:
Python解释器会把传入的一组参数组装成一个tuple传递给可变参数,因此,在函数内部,直接把变量args看成一个tuple就好了。
Args只是个变量名,你爱用a,b,c什么都行。
对list和tuple进行切片
切片Slice操作符。以list为例,tuple也是一样的,就是切片完的返回值为元组tuple就是了
L = ['Adam', 'Lisa', 'Bart', 'Paul']
print(L[0:3]) #切片,从索引0开始切3个元素['Adam', 'Lisa', 'Bart']
print(L[:2]) # ['Adam', 'Lisa']如果第一个索引是0,可以省略
print(L[:]) # ['Adam', 'Lisa', 'Bart', 'Paul']只用一个:,表示从头到尾
print(L[::2]) # ['Adam', 'Bart']还可以给第三个参数,表示每N个取第一个
调用方法:变量名[参数]
可填3个参数,参数使用:间隔。
我的理解:第一个起始索引默认0,第二个切分的个数默认为len(变量)就是切到末尾,第三个参数默认为1。至少需要一个:
倒序切片,切片同样支持负数索引:
print(L[-3:2]) # ['Lisa']
print(L[-4:-1:3]) # ['Adam']
记住倒数第一个元素的索引是-1。
切片包含起始索引,不包含结束索引。
字符串也可以切片:字符串的索引同样从0开始,且支持负索引。
然后切片只能正着切,不能逆着切。
print('ABCDEFG'[-3:-1]) #EF
print('ABCDEFG'[-3:2]) #空 因为索引2的位置比索引-3的位置靠前。
print('ABCDEFG'[-3:4]) #空 位置重叠也是不行的。
Python中的集合
集合是指包含一组元素的数据结构,目前接触到的包括:
1.有序集合:list,tuple,字符串;
2.无序集合:set
3.无序集合并且具有key-value 对:dict
索引迭代
Python中,迭代永远是取出元素本身,而非元素的索引。
对于有序集合,元素确实是有索引的。有的时候,我们确实想在for 循环中拿到索引。
方法是使用enumerate() 函数:enumerate(枚举)
L = ['Adam', 'Lisa', 'Bart', 'Paul']
for index, name in enumerate(L):
print(index, '-', name)
#index即为索引,name为其值
生成列表
使用range()函数
>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Python还有一种特有的语法糖:列表生成式
例:生成[1x1, 2x2, 3x3, ..., 10x10]的列表
[x * x for x in range(1, 11)]
多写写应该就熟悉了。
range(1, 100, 2) 可以生成list [1, 3, 5, 7, 9,...,99]
格式化字符串
字符串可以通过%进行格式化,用指定的参数替代%s。字符串的join()方法可以把一个list 拼接成一个字符串。
def generate_tr(name, score):
return '我是:%s,我考了%s分' % (name, score)
print(generate_tr('菜鸟',98)) #我是:菜鸟,我考了98分
列表生成式中还可以加入条件过滤
在for 循环后面还可以加上 if 判断
>>>[x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
多层表达式
for循环可以嵌套,因此,在列表生成式中,也可以用多层for循环来生成列表。
对于字符串'ABC' 和 '123',可以使用两层循环,生成全排列:
>>> [m + n for m in 'ABC' for n in '123']
['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
翻译成循环代码就像下面这样:
L = []
for m in 'ABC':
for n in '123':
L.append(m + n)
python中列表生成式使用的经典例子
一行代码实现乘法口诀表:
print ('\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))