前言
一个功能需要重复使用,那么就需要将其弄成函数。 示例:
def my_function(x,y,z=1.5):
if z>1:
return z*(x+y)
else:
return z/(x+y)
my_function(5, 6, z = 0.7)
命名空间、作用域和局部函数
作用域(scopes):global and local (全局和局部) 在此需要说明的是,函数中的变量,当在当前函数作用范围之外的时候,是调用不到的(因为已经被摧毁了) 示例:
def func():
a=[]
for i in range(5):
a.append(i)
但若是想要在函数外也能调用变量的话
a = None
def bind_a_variable():
global a
a=[]
bind_a_variable()
print(a)
返回多个值
def f():
a = 5
b = 6
c = 7
return {'a':a,'b':b,'c':c}
return_value = f()
return_value
函数是对象
去掉列表中一些乱码:(使用re.sub)
import re
states=[' Alabama','Georgia!','Georgia','georgia','F10rIda',
'south carolina##','West virginia?']
def clean_strings(strings):
result = []
for value in strings:
value = value.strip()
value = re.sub('[!#?]','', value)
value = value.title()
result.append(value)
return result
clean_strings(states)
re.sub的函数说明: (返回通过替换repl替换字符串中模式最左边不重叠的出现而获得的字符串。Repl可以是字符串,也可以是可调用对象;如果是字符串,则处理其中的反斜杠转义。如果它是一个可调用对象,则它传递了匹配对象并必须返回要使用的替换字符串。)
函数作为列表元素
def remove_punctuation(value):
return re.sub('[!#?]', '', value)
clean_ops=[str.strip, remove_punctuation, str.title]
def clean_strings(strings, ops):
result = []
for value in strings:
for function in ops:
value = function(value)
result.append(value)
return result
clean_strings(states, clean_ops)
封装函数和字符
for x in map(remove_punctuation, states):
print(x)
匿名函数(Lambda)
定义函数的一种简单方式 不用Lambda时:
def short_function(x):
return x * 2
short_function(4)
使用Lambda时:
equiv_anon=lambda x: x * 2
equiv_anon(4)
上述代码结果:8
将函数作为形参:
def apply_to_list(some_list, f):
return [f(x) for x in some_list]
ints = [4,0,1,5,6]
apply_to_list(ints, lambda x: x * 2)
代码结果:
按规则排序
依照列表中有多少种不同元素来排序
strings=['foo', 'card', 'bar', 'aaaa', 'abab']
strings.sort(key=lambda x: len(set(list(x))))
strings
代码结果:
currying
将旧函数中的一个形参定义,然后本身的两个变量变成一个变量
def add_numbers(x,y):
return x+y
add_five = lambda y: add_numbers(5, y)
from functools import partial
add_five = partial(add_numbers,5)
迭代器
不用迭代器:
some_dict = {'a':1,'b':2,'c':3}
for key in some dict:
print(key)
代码结果:
使用迭代器:
dict_iterator = iter(some_dict)
dict_iterator
list(dict_iterator)
代码结果:
def squares(n=10):
print('Generating squares from 1 to {0}'.format(n ** 2))
for i in range(1,n+1):
yield i**2
gen = squares()
for x in gen:
print(x, end = ' ')
迭代器更方便的写法
gen=(x ** 2 for x in range(100))
for x in gen:
print(x, end = ' ')
叠加求和:
sum(x**2 for x in range(100))
迭代器生成字典:
dict((i, i ** 2) for i in range(5))
迭代器-itertools:
groupby:按照某种规则,将列表化成小的集合
import itertools
first_letter = 1ambda x: x[0]
names = ['Alan', 'Adam', 'Wes', 'Will', 'Albert', 'Steven']
for letter, names in itertools.groupby(names, first_letter):
print(letter, list(names))
代码结果:
|