语法:
def functionname( parameters ): "函数_文档字符串" function_suite return[expression] 默认情况下,参数值和参数名称是按函数声明中定义的的顺序匹配起来的。
>>> def func():
... "文档字符串"
... pass
...
>>> print(func.__doc__)
文档字符串
>>> help(func)
Help on function func in module __main__:
func()
文档字符串
>>>
传递指定个数的必备参数,若缺少或多于指定的参数时会报错
字符或者元组)的参数,这个时候就是通过“传值”来传递对象,此时如果想改变原变量的值,可以将这些变量申明为全局变量
代码示例:传不可变对象
#coding=utf-8
def changeNum(num) :
num += 1
print(u"自定义函数中的num = ",num)
#定义变量num,赋初始值为10
num = 10
changeNum(num)
print (u"函数调用后num = ",num)
代码示例:通过global改变原变量的值
a=100
def compute():
global a
a+=1
compute()
print (a)
2.传可变对象:list 、set、 dict、 实例(传引用),如果函数收到的是一个可变对象(比如字典或者列表)的参数,这个时候就是通过传“引用”来传递的参数(其实这种归根结底传的也是值,只不过是指向内存空间地址的值)
代码示例:传可变对象
def changeList(list1) :
list1.append('newStr')
print (u"函数中的list1:",list1)
list1 = [1,2,3]
print (u"调用函数前的list1: ",list1)
changeList(list1)
print (u"调用函数后的list1:",list1)
参数传不可变对象的时候,函数内外变量值是独立的
参数传可变对象的时候,函数内外变量值是关联的
在函数内部,使用global对不可变对象做关联,会对外部的变量有影响
def add(a,b,c):
return a+b+c
print(add(c=1,b=2,a=3))
print(add(c=1,2,3))
默认值必须要放到没有默认值参 数的最后面,否则会报错。这是因为 赋给形参的值是根据位置而赋值的
>>> def add(a,b=1,c=2):
... return a+b+c
...
>>> print(add(1,2,3))
6
>>> print(add(1,2))
5
>>> print(add(1))
4
' a '.strip()用的就是默认参数,去除空白字符(\r、\n、\t、空格)
'a b c'.split()用的也是默认参数,按空格分隔
代码示例:默认值为可变对象
#coding=utf-8
def add_end(L=[]):
L.append('END')
return L
print (add_end([1, 2, 3])) #调用正常
print (add_end(['x', 'y', 'z'])) #调用正常
print (add_end())#调用正常
print (add_end())#调用不正常
print (add_end())#调用不正常
说明:python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,那么下次调用时,默认参数的内容就变了,不再是定义时的[]了。也就是说函数的默认值在内存中也只有一份,所以默认参数必须指向不可变对象!!
解决方案:
#coding=utf-8
def add_end(L=None):
if L is None:
L=[]
L.append('END')
return L
print (add_end([1, 2, 3])) #调用正常
print (add_end(['x', 'y', 'z'])) #调用正常
print (add_end())#调用正常
print (add_end())#调用正常
print (add_end())#调用正常
代码示例:'''add(a,b)要求有个值是result来存结果:
1 a,b 数字,相加
2 a,b 字符串,就当做字符串相加
3 a,b 如果list就当list相加
4 不满足条件,则返回None
'''
def my_add(a,b):
if not isinstance(a,(str,int,list)):
return None
if not isinstance(b,(str,int,list)):
return None
if type(a) !=type(b) :
return None
return a+b
if __name__ == '__main__':
print(my_add(1,2))
print(my_add(1,'2'))
print(my_add('a','b'))
print(my_add(['a','b'],[1,2]))
print(my_add(['a','b'],(1,2)))
代码示例:''求一个字符串中的字母个数函数
需判断传入参数的类型(isinstance(s,str))
必须使用ascii来判断是否字母
'''
def count_letters_num(sentences):
if not isinstance(sentences,str):
return -1
result=0
for word in sentences:
## if word.isalpha():
if (ord(word)>=ord('a') and ord(word)<=ord('z'))\
or (ord(word)>=ord('A') and ord(word)<=ord('Z')):
result+=1
return result
if __name__ == '__main__':
print(count_letters_num('it is a nice day!'))
def func(a,b,*arg):
print(type(arg))
for i in arg:
print(i)
print(func(1,2,3,4,5,6))
2.字典作为可变参数:**
def func(**kw):
print(type(kw))
for i in kw:
print(i)
for j in kw.values():
print(j)
print(func(a="1",b=2,c=3))
代码示例:
'''同时使用*arg和**kw,算一下字母的长度之和,注意所有参数均使用字符串,字符串都是字母。
'''
def count_letters_len(a,b='b',*arg,**kw):
result = 0
result+=len(a)
result+=len(b)
for i in arg:
result+=len(i)
for v in kw.values():
result+=len(v)
return result
if __name__ == '__main__':
print(count_letters_len('cda','def','helloworld',x='123',y='hellopython'))
>>> def func():pass
...
>>> print(func())
None
>>> a=[1,2,3]
>>> print(a.sort())
None
>>> def func(a,b):
... return a,b
...
>>> print(func(1,2))
(1, 2)