==================================
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、网页空间、营销软件、网站建设、宜黄网站维护、网站推广。
将列表传递给函数后,函数就能直接访问其内容
假设有一个用户列表,要问候其中的每位用户
将列表传递给函数后,函数就可对其进行修改,在函数中对这个列表所做的任何修改都是永久性的
一家为用户提交的设计制作3D打印模型的公司,需要打印的设计存储在一个列表中,打印后转移到另一个列表中。
有时候需要禁止函数修改列表,为解决这个问题,可想向函数传递列表的副本而不是元件;这样函数所做的任何修改都只影响副本,不影响元件
有时候,预先布置的函数需要接受多少个实参,python允许函数从调用语句中手机任意数量的实参
一个制作披萨的寒素,它需要接受很多配料,但无法确定顾客要多少种配料,下面函数只有一个形参*toppings,不管调用语句提供了多少实参,这个形参都将他们统统收入囊中
如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后
python先匹配位置实参和关键字实参,再将余下的实参收集到最后一个形参中
如果前边的函数还需要一个表示披萨尺寸的实参,必须将该形参放在*toppings的前面
有时候,需要接受任意数量的实参,但预先不知道传递给函数的会是射门杨的信息,再这种情况下,可将函数编写成能够接受任意数量的键-值对,调用语句提供了多少就接受多少
创建用户简介:你知道你将收到有关用户的信息,但不确定会是什么样的信息,在下面示例中,build_profile()接受名和姓,同时还接受任意数量的关键字实参
1、定义函数
函数是可重用的程序。本书中已经使用了许多内建函数,如len()函数和range()函数,但是还没自定义过函数。定义函数的语法格式如下:
def 函数名(参数):
函数体
定义函数的规则如下:
①关键字def用来定义一个函数,它是define的缩写。
②函数名是函数的唯一标识,函数名的命名规则遵循标识符的命名规则。
③函数名后面一定要紧跟着一个括号,括号内的参数是可选的,括号后面要有冒号。
④函数体(statement)为一个或一组Python语句,注意要有缩进。
⑤函数体的第一行可以有文档字符串,用于描述函数的功能,用三引号括起来。
按照定义规则,可以定义第一个函数了:
def hello_world():
... print('Hello,world!') # 注意函数体要有缩进
...
hello_world()
Hello,world!
这个函数不带任何参数,它的功能是打印出“Hello,world!”。最后一行代码hello_world()是调用函数,即让Python执行函数的代码。
2、全局变量和局部变量
全局变量是定义在所有函数外的变量。例如,定义一个全局变量a,分别在函数test1()和test2()使用变量a:
a = 100 # 全局变量
def test1():
... print(a)
...
def test2():
... print(a)
...
test1()
100
test2()
100
定义了全局变量a之后,在函数test1()和test2()内都可以使用变量a,由此可知,全局变量的作用范围是全局。
局部变量是在函数内定义的变量,除了用关键字global修饰的变量以外。例如,在函数test1()内定义一个局部变量a,分别在函数外和另一个函数test2()内使用变量a:
def test1():
... a = 100 # 局部变量
... print(a)
...
def test2():
... print(a)
...
test1()
100
print(a)
Traceback (most recent call last):
File "stdin", line 1, in module
NameError: name 'a' is not defined
test2()
Traceback (most recent call last):
File "stdin", line 1, in module
File "stdin", line 2, in test2
NameError: name 'a' is not defined
Python解释器提示出错了。由于局部变量a定义在函数test1()内,因此,在函数test1()内可以使用变量a,但是在函数外或者另一个函数test2()内使用变量a,都会报错,由此可见,局部变量的作用范围是定义它的函数内部。
一般情况下,在函数内声明的变量都是局部变量,但是采用关键字global修饰的变量却是全局变量:
def test1():
... global a # 全局变量
... a = 100
... print(a)
...
def test2():
... print(a)
...
test1()
100
print(a)
100
test2()
100
这个程序与上个程序相比,只是在函数test1()中多了一行代码“global a”,程序便可以正确运行了。在函数test1()中,采用关键字global修饰了变量a之后,变量a就变成了全局变量,不仅可以在该函数内使用,还可以在函数外或者其他函数内使用。
如果在某个函数内局部变量与全局变量同名,那么在该函数中局部变量会覆盖全局变量:
a = 100 # 全局变量
def test1():
... a = 200 # 同名局部变量
... print(a)
...
def test2():
... print(a)
...
test1()
200
test2()
100
由于在函数test1()中定义了一个与全局变量同名的局部变量a,因此,在函数test1()中全局变量a的值被局部变量覆盖了,但是在函数test2()中全局变量a的值没有被覆盖。
综上所述,在Python中,全局变量保存的数据供整个脚本文件使用;而局部变量只用于临时保存数据,变量仅供局部代码块使用。
内置函数就是Python给你提供的,拿来直接用的函数,比如print.,input等。
截止到python版本3.6.2 ,python一共提供了68个内置函数,具体如下
本文将这68个内置函数综合整理为12大类,正在学习Python基础的读者一定不要错过,建议收藏学习!
(1)列表和元组
(2)相关内置函数
(3)字符串
frozenset 创建一个冻结的集合,冻结的集合不能进行添加和删除操作。
语法:sorted(Iterable, key=函数(排序规则), reverse=False)
语法:fiter(function. Iterable)
function: 用来筛选的函数. 在filter中会自动的把iterable中的元素传递给function. 然后根据function返回的True或者False来判断是否保留留此项数据 , Iterable: 可迭代对象
搜索公众号顶级架构师后台回复“面试”,送你一份惊喜礼包。
语法 : map(function, iterable)
可以对可迭代对象中的每一个元素进行映射. 分别去执行 function
hash : 获取到对象的哈希值(int, str, bool, tuple). hash算法:(1) 目的是唯一性 (2) dict 查找效率非常高, hash表.用空间换的时间 比较耗费内存
Python 函数定义以及参数传递
1.函数定义
#形如def func(args...):
doSomething123
以关键字def 开头,后面是函数名和参数下面是函数处理过程。
举例:
def add( a, b ):
return a+b12
参数可以设定默认值,如:
def add( a, b=10 ): #注意:默认值参数只会运算一次
return a+b12
默认值参数只会运算一次是什么意思?
def func( a, b=[] ): #b的默认值指向一个空的列表,每次不带默认值都会指向这块内存
b.append(a) return b
print(func(1))#向默认的空列表里加入元素1 ,默认列表里已经是[1]print(func(2))#向默认的列表里加入元素2,默认列表里已经是[1,2]print(func(3,[]))#向b指向的空列表里加入元素1 ,默认列表里还是[1,2]print(func(4))#向默认的列表里加入元素4,默认列表里已经是[1,2,4]'''
结果:
[1]
[1, 2]
[3]
[1, 2, 4]
'''12345678910111213141516
这下明白为什么默认参数只计算一次了吧,函数参数不传递时默认值总是指向固定的内存空间,就是第一次计算的空间。
2.参数传递
def func(a, b):
print('a=%d, b=%d' % (a,b) )12
在使用函数时可以如下方式,结果都是相同的
func(10,20) #不使用参数名,需要按参数顺序传递func(a=10,b=20) #使用参数名可以不按顺序传递func(b=20,a=10)#结果:a=10, b=20a=10, b=20a=10, b=201234567
如果函数定义形式如下方式:
def func(*args): #这种定义会把传递的参数包成元组
print(args,type(args))
func(10,20)#结果:#(10, 20) class 'tuple'1234567
举一个和上述过程相反的例子:
def func(a,b):
print('a=%d, b=%d' % (a,b) )
a = (10, 20)
func(*a) #在调用函数使用`*`则会把元组解包成单个变量按顺序传入函数#结果:a=10, b=20123456
总结:*号在定义函数参数时,传入函数的参数会转换成元组,如果 *号在调用时则会把元组解包成单个元素。
另一种定义:
def func(**kw):#使用**定义参数会把传入参数包装成字典dict
print(kw, type(kw) )
func(a=10,b=20)#这种函数在使用时必须指定参数值,使用key=value这种形式#结果:{'b': 20, 'a': 10} class 'dict'12345
相反的例子:
def func(a,b):
print('a=%d, b=%d' % (a,b) )
d = {'a':10, 'b':20 }
func(**d) #在调用时使用**会把字典解包成变量传入函数。12345
def func(*args, **kw):#这种形式的定义代表可以接受任意类型的参数
print(args,kw )12
总结:**号在定义函数参数时,传入函数的参数会转换成字典,如果 **号在调用时则会把字典解包成单个元素。
lambda表达式
lambda表达式就是一种简单的函数
形如 f = lambda 参数1,参数2: 返回的计算值
例如:
add = lambda x,y: x+y
print(add(1,2))'''
结果:3
'''12345
例如上面的例子,实现一个整形集合的累加。假设lst = [1,2,3,4,5],实现累加的方式有很多:
第一种:用sum函数。
sum(lst)
第二种:循环方式。
def customer_sum(lst):
result = 0
for x in lst:
result+=x
return result
def customer_sum(lst):
result = 0
while lst:
temp = lst.pop(0)
result+=temp
return result
if name ==" main ":
lst = [1,2,3,4,5]
print customer_sum(lst)
第三种:递推求和
def add(lst,result):
if lst:
temp = lst.pop(0)
temp+=result
return add(lst,temp)
else:
return result
if name ==" main ":
lst = [1,2,3,4,5]
print add(lst,0)
第四种:reduce方式
lst = [1,2,3,4,5]
print reduce(lambda x,y:x+y,lst)
lst = [1,2,3,4,5]
print reduce(lambda x,y:x+y,lst,0)
def add(x,y):
return x+y
print reduce(add, lst)
def add(x,y):
return x+y
print reduce(add, lst,0)
有一个序列集合,例如[1,1,2,3,2,3,3,5,6,7,7,6,5,5,5],统计这个集合所有键的重复个数,例如1出现了两次,2出现了两次等。大致的思路就是用字典存储,元素就是字典的key,出现的次数就是字典的value。方法依然很多
第一种:for循环判断
def statistics(lst):
dic = {}
for k in lst:
if not k in dic:
dic[k] = 1
else:
dic[k] +=1
return dic
lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]
print(statistics(lst))
第二种:比较取巧的,先把列表用set方式去重,然后用列表的count方法
def statistics2(lst):
m = set(lst)
dic = {}
for x in m:
dic[x] = lst.count(x)
lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]
print statistics2(lst)
第三种:用reduce方式
def statistics(dic,k):
if not k in dic:
dic[k] = 1
else:
dic[k] +=1
return dic
lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]
print reduce(statistics,lst,{})
或者
d = {}
d.extend(lst)
print reduce(statistics,d)
通过上面的例子发现,凡是要对一个集合进行操作的,并且要有一个统计结果的,能够用循环或者递归方式解决的问题,一般情况下都可以用reduce方式实现。
一个简单的例子:将一个list中所有元素平方,常规的做法如下图所示,虽然实现了这个功能,但并没有给人一目了然的感觉。若换成map来实现,则会好很多。
1、map函数介绍及其简单使用
上述用一个简单的例子演示的map函数的用法及其优势,下面将详细介绍map函数的用法:map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每一个元素,并把结果作为新的Iterable返回。其语法格式为:
map(function,iterable...)
function---函数名
iterable---一个或多个序列
map作为高阶函数,事实上它把运算规则抽象了,我们可以用这种方式计算任意复杂的函数,再比如,把一个list的所有数据转为string类型:
再举一个小例子,对list中的各个元素开方,一步到位:
!注意:在使用math自带函数时,只需要函数名即可
2、map函数与lambda函数结合使用,下面方法同样可以达到对list中的数二次方的目的
map函数与lambda函数结合使用,可以传入两个参数相加:
还可以同时计算多个值: