首先,学一门语言都会问:点解要学这门语言? 而学Python的原因很简单,原因就是…..好鬼简单.(这句话不是我说的) 很喜欢Python极简的代码风格,以及众多功能强大的模块…… 学了两天Python有点点体会,觉得应该总结一下有哪些应该注意的地方.
初学者推荐一个公众号:Crossin的编程教室(喜欢作者的教学方式)
用Mac或者Linux的同学是幸福的,直接在终端输入idle
就好了,这两个系统都是默认自带Python的,如果想直接在终端打开Python Shell,直接输入python
就好了.windows下就有点麻烦,好吧,事实上麻烦到我不想去尝试配置了,详情见Crossin的编程教室
第一课.
配置好之后就可以打出你的第一行代码啦!
>>>print ‘Hello World!’
这个函数的兼容性可以说极强
>>> print “hello” #双引号可以 hello >>> print ‘world’ #单引号可以 world >>> print 1 #纯数字直接写 1 >>> print 3.14 3.14 >>> print 3e30 3e+30 >>> print 1 + 2 * 3 #支持表达式计算 7 >>> print(2 > 5) #支持真假判断 False
有一点值得注意的是:2.0版本print和print()都是可以的,但是3.0之后print后面的表达式必须加括号.
input()
接收的是一个值或变量,也就是说,你如果输 123,程序接收到的就是整数 123,你输 True,就是 bool 值 True。如果你输了 python,程序会认为这是一个叫做 python 的变量,而假如你没有定义过这个变量,就会报错。所以如果想通过input获得一段文字,输入的时候必须把文字用双引号或者单引号括起来.
raw_input()
接收的是一个字符串,不管你输入什么都会当做一个字符串.
然后在3.0之后,将input()
和raw_input()
合并了,为了减少混乱吧…保留input关键字,但是功能确保留了raw_input的功能,就是说,在3.0之后,你用input(),获得的就是一段字符串,无论你输入什么.那么问题来了,我想要获得一个值或者一个变量肿么办?value = eval(input())
即可.
命名规则:
Python是动态变量类型的,定义变量的时候不需要指明这个变量是什么类型,编译器会根据赋给变量的值去判断类型:
name = ‘Crossin’ #字符型(需要用’ ‘或者” “引起来) myVar = 123 #整型 price = 5.99 #浮点型 visible = True #布尔型 a = 1 > 3 #通过逻辑表达式赋值
在python中,以下数值会被认为是False:
其他的值都认为是True。 因为’False’是一个非空字符串,所以转成bool类型之后,就是True,所以bool(‘False’) = True,同理bool(‘ ‘) = True.
Python不需要用分号来结束一行代码,取而代之的就是严格的缩进格式,刚刚开始就是过因为缩进格式不对,不断出现错误,具体你在敲一个回车的时候,下一行要缩进几格是可以设置的:Preferences->Indentation Width(这个是mac下的设置路径,windows下的名字也应该大同小异)
import random
import语句告诉python,我们要用random模块中的内容。然后便可以使用random中的方法,比如:
random.randint(1, 10)
random.choice([1, 3, 5])
注意,函数前面需要加上“random.”,这样python才知道你是要调用random中的方法。
想知道random有哪些函数和变量,可以用dir()方法:
dir(random)
如果你只是用到random中的某一个函数或变量,也可以通过from…import…指明:
from math import pi
print pi
为了便于理解和避免冲突,你还可以给引入的方法换个名字:
from math import pi as math_pi
print math_pi
读写文件有三种模式:
r
:只读模式w
:覆盖模式a
:添加模式函数格式: file(‘文件名’,’参数’) open(‘文件名’,’参数’)
读文件命令很简单:
file('文件名') #默认参数为r
如果文件和代码放在同一个文件夹,直接写名字就好了,不是就要写文件的绝对路径.还有很神奇的一点就是,如果路径没有找到文件,就会自动创建这个文件.
c = bool and a or b
通常情况下,只要bool值为真则a,为假则b 但如果当a本身就为假,比如0,’’.这时,几时bool为真也会取b,所以为了避免这种情况,应当将a->[a] , b->[b],将元素变成列表,即使是[‘’]或者[0]这是为真的,但是对应的,表达式返回的也是一个列表,去列表第一个元素即可,因此表达式也要相应改变一下:
c = (bool and [a] or [b])[0]
首先,使用之前都要import random模块:
import random
调用时是调用类方法的的形式:
num = random.randint(1,100)
常用的方法;
random.random() #生成一个0到1之间的随机浮点数,包括0但不包括1,也就是[0.0, 1.0)。
random.uniform(a, b) #生成a、b之间的随机浮点数。不过与randint不同的是,a、b无需是整数,也不用考虑大小。
random.choice(seq) #从序列中随机选取一个元素。seq需要是一个序列,比如list、元组、字符串。
random.randrange(start, stop, step) #生成一个从start到stop(不包括stop),间隔为step的一个随机数。start、stop、step都要为整数,且start<stop。
random.sample(population, k) #从population序列中,随机获取k个元素,生成一个新序列。sample不改变原来序列。
random.shuffle(x) #把序列x中的元素顺序打乱。shuffle直接改变原有的序列。
Python的列表(list)就是数组,支持表达式赋值 比如从另一个list中去部分元素:
ist_1 = [1, 2, 3, 5, 8, 13, 22]
list_2 = [i for i in list_1 if i % 2 == 0] #从list_1中取出模2的数
print list_2
输出
[2, 8, 22]
可以看我之前写的一篇博文:python正则表达式的部分特殊符号
Hi和hi
: 默认情况下,正则表达式是严格区分大小写的.
[0-9]
: [0123456789]可以写成[0-9]这种形式,同理,类似的还有[a-zA-Z].
()
: ()在正则表达式里也有着特殊的含义, 所以要匹配字符”(“, 需要用”\(“.
".*" 和 ".*?"
“*”
在匹配时,会匹配尽可能长的结果。如果你想让他匹配到最短的就停止,需要用“.*?”
。如“I.*?e”
,就会得到第二种结果。这种匹配方式被称为懒惰匹配,而原本尽可能长的方式被称为贪婪匹配。
基本方式:
fun1(a,b)
: 调用时提供参数的位置进行匹配,要求实参与行参的数量相等,默认按位置匹配参数。调用时,少参数或者多参数都会引起错误。
def func(arg1, arg2):
print arg1, arg2
func(3, 7)
Python 还提供了其他一些更灵活的参数传递方式,如:
func2(a=1, b=2, c=3)
: 有默认值,当没有提供足够的参数时, 会用默认值作为参数的值.提供的参数会按顺序先匹配前面位置的参数, 后面未匹配到的参数使用默认值.
def func(arg1=1, arg2=2, arg3=3):
print arg1, arg2, arg3
func(2, 3, 4)
func(5, 6)
func(7)
输出为
2 3 4
5 6 3
7 2 3
当然,也可以直接用形参去指定某个参数,但是,没有指定参数名的参数
必须在所有
指定参数名的参数
前面, 且参数不能重复
.
func(arg2=8)
func(arg3=9, arg1=10)
func(11, arg3=12)
func3(*args)
: 这种方式的厉害之处在于, 它可以接受任意数量的参数.
def calcSum(*args):
sum = 0
for i in args:
sum += i
print sum
calcSum(1,2,3)
calcSum(123,456)
calcSum()
输出:
6
579
0
在变量前加上星号前缀(*),调用时的参数会存储在一个 tuple(元组)对象
中,赋值给形参。在函数内部,需要对参数进行处理时,只要对这个 tuple 类型的形参(这里是 args)进行操作就可以了。因此,函数在定义时并不需要指明参数个数,就可以处理任意参数个数的情况。
不过有一点需要注意,tuple 是有序的,所以 args 中元素的顺序受到赋值时的影响。如:
def printAll(*args):
for i in args:
print i,
print
printAll(1,2,3)
printAll(3,2,1)
输出:
1 2 3
3 2 1
虽然3个参数在总体上是相同的,但由于调用的顺序不一样,结果也是不同的。
func4(**kargs)
: 既可以按参数名传递参数, 不受位置的限制, 又可以像 tuple 传递一样不受数量限制.因为func(**kargs) 则是把参数以键值对字典
的形式传入。字典是无序的,所以在输出的时候,并不一定按照提供参数的顺序。同样在调用时,参数的顺序无所谓,只要对应合适的形参名就可以了。于是,采用这种参数传递的方法,可以不受参数数量、位置的限制。
def printAll(**kargs):
for k in kargs:
print k, ':', kargs[k]
printAll(a=1, b=2, c=3)
printAll(x=4, y=5)
输出:
a : 1
c : 3
b : 2
y : 5
x : 4
当然,Python能做到的不仅如此,以上几种方式不满意,你还可以混着用.
def func(x, y=5, *a, **b):
print x, y, a, b
func(1)
func(1,2)
func(1,2,3)
func(1,2,3,4)
func(x=1)
func(x=1,y=1)
func(x=1,y=1,a=1)
func(x=1,y=1,a=1,b=1)
func(1,y=1)
func(1,2,3,4,a=1)
func(1,2,3,4,k=1,t=2,o=3)
输出:
1 5 () {}
1 2 () {}
1 2 (3,) {}
1 2 (3, 4) {}
1 5 () {}
1 1 () {}
1 1 () {'a': 1}
1 1 () {'a': 1, 'b': 1}
1 1 () {}
1 2 (3, 4) {'a': 1}
1 2 (3, 4) {'k': 1, 't': 2, 'o': 3}
在混合使用时,首先要注意函数的写法,必须遵守:
可以省略某种类型的参数,但仍需保证此顺序规则。调用时也需要遵守:
而在函数被调用时,参数的传递过程为:
lambda是一种匿名函数,而且是一个极度简单的单行函数.
语法格式:
lambda 参数列表: 表达式
例子:
def sum(a, b, c):
return a + b + c
->sum = lambda a, b, c: a + b + c
首先来说两个例子:
1. 假设有一个数列,如何把其中每一个元素都翻倍?
2. 假设有两个数列,如何求和?
第一个问题:
lst_1 = (1,2,3,4,5,6)
lst_2 = map(lambda x: x * 2, lst_1)
print lst_2
第二个问题:
print reduce((lambda x, y: x + y), xrange(1, 101))
教程里是这么解释的:
"map 可以看作是把一个序列根据某种规则,映射到另一个序列。reduce 做的事情就是把一个序列根据某种规则,归纳为一个输出。"
先看看函数的调用格式:
map: map(函数,序列) #第一个参数是一个函数, 之后的参数是序列, 可以是 list、tuple.
reduce: reduce(函数,序列) #第一个参数也是一个函数, 之后的参数是序列, 可以是 list、tuple.
它们的的区别就在与函数参数的功能不同,map的参数函数必须是一个一元操作函数
,reduce的参数函数必须是一个二元操作函数
所以通常map返回的是一个序列,二reduce返回的是一个运算结果.
所以,如果你要处理一个序列以获得新的序列,就用map; 如果想根据一个数列计算出某个结果,那就用reduce吧~~~
ps: Python3.0之后, reduce已经被移出内置函数, 使用 reduce 需要先通过 from functools import reduce 引入.
上面的总结reduce的时候提到了xrange()这个函数,开始我也只是奇怪,并没有去纠结它和range()有什么不同,但是某一次我试着打印xrange(1,11),发现输出也是xrange(1,11):
而打印range(1,11),输出的是一个列表:
其实range()
和xrange()
的定义是一样的:
range(start=0,stop,step)
xrange(start=0,stop,step)
不同的是:range()返回一个递增或递减的数字列表, xrange 是一个类, 返回的是一个xrange对象. 所以打印出来才会是像xrange(1,11)这样的结果.
xrange()的优点在于:使用xrange()进行遍历, 每次遍历只返回一个值. range()返回的是一个列表, 一次性计算并返回所有的值. 因此, xrange()的执行效率要高于range().
Python到处都体现着简单
这两个字.
开辟多线程只需一行代码:
start_new_thread(function, args[, kwargs])
不用手动管理线程, 通常情况, 线程在 function 执行完毕后结束.
然而Python的多线程并不完善,这里推荐两篇文章,有兴趣可以去研读一下: