python入门有很多教程,习惯上比较讲究快速学习的同学,可以选择廖雪峰的网站和python简明教程,小小白上半年偶尔看过一遍廖雪峰的教程,然而……没有记住,因为当时完全没有实战,所以说学习编程还是要不断的练习和分享,以及做笔记啊。因此本次我选择python简明教程并且结合廖雪峰的网站。
推荐安装pycharm编辑器,用过都说好。
官网直接下载。解压,打开bin文件夹,终端运行 sh pycharm.sh,出现安装界面,选择激活码。
激活码参考:blog.csdn.net/lhw413/article/details/72357062 。
装在了window电脑的ubuntu虚拟机卡的喲,简直人生无望,果断重装window版。
安装配置有很多教程,不再赘述,参考:wenku.baidu.com/view/81038a877cd184254b35359b.html
1.基本概念:
python中4种类型的数,整数,长整数,浮点数(相当于小数),复数(-5+4j)
字符串使用,单引号双引号的一样,三引号可以只是多行的字符串,并且可以在其中使用单双引号。
想要在字符串中包含单引号除了三引号还有\,\' 转义符。但\在行尾表示字符串接下一行。
自然字符串:给字符串的前缀加R或者r,特殊字符串失去意义,例如正则表达式可以使用中这种形式,否则转义符太多。
Unicode字符串:字符串前加上前缀u或者U,简单说就是给字符一个唯一的存储数字,跨平台,跨语言通用。
字符串按照字面意义相邻放着,自动被Python相连。
变量:y=x+1 中的x,y
标识符:字母,下划线,数字,注意大小写。
对象:在python中任何东西都可以称为对象。
缩进:同一层次的语句必须有相同的缩进。每一组称之为块。
list 有序的集合可以随时添加删除值【】:
classmates = ['Michael','Bob','Tracy'] ,len()获得list元素的长度
.append 在末尾添加元素;.insert (1.值) 在1位插入值;.pop(i)删除list值
tuple : 元组,一旦初始化不能修改。注:只有一个字符的元组,在后面加,以免歧义。(1,)
dict: 快速查找存储,但是空间消耗大。{} 通过key直接拿到value. In可以判断key知否存在,.pop删除key
set:无序无意义的集合,提供一个list作为输入集合 显示不证明有序,.remove删除key
不变对象:调用自身的任何对象方法,都不会改变对象自身 的内容,相反这些对象会创建新的对象并返回,这也就保证了不可变对象是不可变。
2.控制流(语法)
共三种if,for,while
if
if - else
if (条件判断):
print1
elif (条件判断):
print2
else:
print2
从上到下依次执行。第一个判断条件为true,余下忽略。
循环语句
for - in循环
for x in…… 就是把每个元素代入变量x,然后执行缩进的块的语句。
生出整数序列:range(5)从0开始小于5的整数,提供第三个数为步长,比如(1,5,2)再用list()转换为list,输出为1,3
例如:
sum =0
for x in range(101):
sum = sum + x
print (sum)
while
条件满足,不断循环,条件不满足,退出循环。
sum =0
n =99
while n >0:
sum = sum + n
n = n-2
print (sum)
break
用来终止循环语句。无论结果是否为true,或者序列有没有完全被递归。也就是说从for过着while循环中终止,任何对应的循环的else块将不执行。
while True:
s = raw_input ('Enter something:') ### raw_input 将输入的都表示为字符串。
if s == 'quit':
break ### 程序终止 ,输出done
print 'length of the string is',len(s) ###否则输出s的字符串长度。
print 'Done'
continue
跳过当前的循环块的剩余语句,继续进行下一步循环。
while True:
s = raw_input ('Enter something:')
if s == 'quit':
break
if len(s) < 3:
continue
print 'Input is of sufficient length'
print 'Done'
尽量避免continue 和 break ,容易进入死循环。
3.函数
调用函数
定义函数
def 函数名(参数):
函数内容
如:def hello ():
print 'hello world'
函数形参
函数中的参数称之为形参,提供的赋值称之为实参。
函数返还值:从被调函数返还到主函数,并且返回一个计算的值,也就是说主函数调用这个函数的时候得到这个返还值。
当你在函数定义变量的是后,它与函数外具有相同名称的变量没有关系,函数的变量名对于函数来说是局部的,这就是变量的作用域、
global 语句
定义在函数外的变量赋值。使用该语句可以清楚的表明变量是在外面的块定义。也就是他代表赋值是全局的。
默认参数值
函数定义的形参后面跟上= 赋值,函数的形参就有了默认的参数值,不可变。
只有形参表末尾的函数可以有默认参数值,也就是说声明函数的形参的时候,不能先声明有默认值的形参再声明没有默认值的形参、也就是必选参数在前,默认参数在后,当函数有多个参数的时候,变化大的在前,变化小的在后,降低难度。
有多个默认参数的时候,可以按照顺序提供默认参数,也可以不按照顺序直接写参数值,表示这个参数用传进去的值。
可变参数:参数加*,表示参数作为可变参数,允许添加0到多个参数,函数调用时自动组成tuple.
也可以在list前加,表示list中的元素作为可变元素添加。
def calc(*numbers):
关键参数
允许传入0到多个含有参数名的参数,自动组成dict。通过命名给参数赋值,称之为关键函数。不在乎位置。
**kw kw作为关键参数
>>> extra = {'city': 'Beijing', 'job': 'Engineer'} ###先组建一个dict
>>> person('Jack', 24, **extra)###作为关键参数填进去
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
命名关键参数:
如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下:
def person(name, age, *, city, job):
print(name, age, city, job)
命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
调用方式如下:
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
参数组合
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
递归函数
如果一个函数在内部调用自身本身,这个函数就是递归函数。
函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。解决方法尾递归。
4.高级特性
切片
L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素,也可以倒数切片,倒数第一个元素的索引是-1。可以用于字符串。
前10个数,每两个取一个,
>>> L[:10:2]
[0, 2, 4, 6, 8]
所有数,每5个取一个:
>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
迭代
在Python中,迭代是通过for ... in来完成,不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。
默认情况下,dict迭代的是key。如果要迭代value,for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。也可以迭代字符串。
如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
在for循环中同时迭代索引和元素本身:
for i, value in enumerate(['A', 'B', 'C']):
... print(i, value)
列表生成式
创建list
[1x1, 2x2, 3x3, ..., 10x10]:
>>> [x * x for x in range(1, 11)];>>> [x * x for x in range(1, 11) if x % 2 == 0]###偶数平方
写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来。
两层循环,可以生成全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
列表生成式也可以使用两个变量来生成list:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']
一个list中所有的字符串变成小写:
>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']
生成器 generator
为了节省空间,一遍循环一边计算。
只要把一个列表生成式的[]改成(),就创建了一个generator;如果一个函数定义中包含yield关键字,是一个generator
for循环可迭代。
变成generator的函数,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
迭代器:
可以直接作用于for循环的对象统称为可迭代对象:Iterable
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数,
>>> isinstance(iter([ ]), Iterator):
True
5.函数式编程、
高阶函数
函数本身可以赋值给变量,调用变量可以调用函数。所以一个函数可以接受另一个函数作为参数,这就是高阶函数。
map函数
接收两个参数,一个是函数,一个是迭代对象。例如:
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
reduce函数
与map函数的区别:
①从参数方面来讲:
map()函数:
map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元组)。其中,函数(即map的第一个参数位置的函数)可以接收一个或多个参数。
reduce()函数:
reduce() 第一个参数是函数,第二个是 序列(列表或元组)。但是,其函数必须接收两个参数。
②从对传进去的数值作用来讲:
map()是将传入的函数依次作到序列的每个元素,每个元素都是独自被函数“作用”一次;(请看下面的栗子)
reduce()是将传人的函数作用在序列的第一个元素得到结果后,把这个结果继续与下一个元素作用(累积计算),
最终结果是所有的元素相互作用的结果。
filter函数
用于过滤序列,和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
sorted函数
排序算法
可以进行数字与list排序,关键在于建立映射。
返还函数
把函数作为结果值返还。
6.模块
模块是包含了所有你定义的函数和变量的文件,为了在其他程序中重用模块,py为扩展名。
7.面向对象的编程
而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息。