python的内置函数有很多
例如:
abs函数:这个和php一样
cmp(x,y)比较函数:如果x<y,返回-1,如果x==y,返回0,如果x>y,返回1;这个函数还是有点不太一样需要特地记一下。
数据类型转换函数:int整形函数、float浮点型函数、str字符串型函数、unicode编码转换函数、bool布尔型函数;这写函数方法都是根据类型的名字来命名的记起来很好记。
给函数起别名:
>>> a = abs # 变量a指向abs函数
>>> a(-1) # 所以也可以通过a调用abs函数
这个起别名的方法很简单,不过我感觉用处不大。
定义函数:
在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
pass占位符,放一个pass,让代码能运行起来。
python函数可以返回多个值,原理其实是返回了一个数组,由于语法的原因可以省略括号
函数的参数
例如:如何计算x的n次方
def power(x, n):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
上面的方法固定了传参,如果少传就会报错,因此还可以设置默认参数“def power(x, n=2):”
几点重点记忆:
必选参数在前,默认参数在后
如何设置默认参数
多个传参时变化大的在前面变化小的在后面
def func(a, b, c=0, *args, **kw):
print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw
*args是可变参数,args接收的是一个tuple;
**kw是关键字参数,kw接收的是一个dict。
递归函数
这块当然逻辑都是一样的,函数在内部可以调用自身那么他就是递归函数
还有文档上的例子(if else 的写法看上去还是很简单特别的):
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
切片
切片概念:
数组名[0:3],0:3是数组中的索引,指获取数组0到3的元素,
还可以使用负数,
数组名[-10:]后10个数,
数组名[::5]数组中每5个元素取一个,
数组名[:10:2]前10个数,每两个取一个,
数组名[10:20]前11-20个数,
什么都不写,只写[:]就可以原样复制一个数组:
重点:字符串也可使用切片操作
例如:'ABCDEFG'[:3]
迭代:
在Python中,迭代是通过for ... in来完成的
默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.itervalues(),如果要同时迭代key和value,可以用for k, v in d.iteritems()。
列表生成式
列表生成式的代码格式,感觉还是比较不好使用的
range(1, 11),可以生成1到11的数组
[x * x for x in range(1, 11)],当然还可以加上一些计算
[x * x for x in range(1, 11) if x % 2 == 0],for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方
for循环其实可以同时使用两个甚至多个变量,比如数组后面跟iteritems()可以同时迭代key和value
lower(),将list中所有的字符串变小写
生成器
在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
L = [x * x for x in range(10)]
L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
g = (x * x for x in range(10))
g
创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。
高阶函数
变量可以指向函数,这个还是很特别的
f = abs
a = f(-10)
10
传入函数
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
def add(x, y, f):
return f(x) + f(y)
当我们调用add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs,根据函数定义,我们可以推导计算过程为:
x ==> -5
y ==> 6
f ==> abs
f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
map()
map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回.
def f(x):
return x * x
a = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print a
[1, 4, 9, 16, 25, 36, 49, 64, 81]
filter
Python内建的filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
如何勇filter()删除1~100的素数呢?
import math
def is_prime(n):
list_num = []
for i in range(2, n):
for num in range(2, int(math.sqrt(n))+1):
if i % num == 0 and i != num:
break
elif i % num != 0 and num == (int(math.sqrt(n))):
list_num.append(i)
return list_num
print is_prime(100)
总结:本周主要围绕着python的函数部分在看,整理一些比较有代表性的例子,同时明显感受代码风格和逻辑能接受,但是无法段时间熟练掌握,代码风格差异和php比起来蛮大的,有很多细节运行demo的时候需要花时间理解,这周进度很慢问题是有些地方不好理解,下周加快进度,再写一些稍难一点的demo,来加深这部分语法风格的掌握。