python3基础:函数基本语法

函数

 

作用:代码复用,便于维护

定义规则:

  1. 函数代码块以def关键词开头,后接函数标识符名和圆括号()。
  2. 任何传入实参和形参必须放在圆括号中。圆括号中写的是形参。
  3. 函数的第一行语句可以选择性地使用文档字符串—-用于存放函数说明。
  4. 函数内容以冒号起始,并且函数体要有缩进。
  5. return[expression]结束函数,选择性地返回一个值给调用者。不带表达式 的return相当于返回None。
  6. (__builtins__):查看内置的方法和函数

 

文档字符串

语法:

def functionname( parameters ): "函数_文档字符串" function_suite return[expression] 默认情况下,参数值和参数名称是按函数声明中定义的的顺序匹配起来的。

>>> def func():

...     "文档字符串"

...     pass

...

 

 

>>> print(func.__doc__)

文档字符串

>>> help(func)

Help on function func in module __main__:

 

func()

    文档字符串

 

>>>

 

函数参数:

无参函数:不需要传参数

有参函数:

  • 必备参数:

      传递指定个数的必备参数,若缺少或多于指定的参数时会报错

  1. 传不可变对象:所有的数字、字符串、元祖。函数收到的是一个不可变对象(比如数字、

字符或者元组)的参数,这个时候就是通过“传值”来传递对象,此时如果想改变原变量的值,可以将这些变量申明为全局变量

 

代码示例:传不可变对象

#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)

python3基础:函数基本语法_第1张图片

  • 总结:

参数传不可变对象的时候,函数内外变量值是独立的

参数传可变对象的时候,函数内外变量值是关联的

 

在函数内部,使用global对不可变对象做关联,会对外部的变量有影响

 

  • 命名参数:命名参数必须放在可选参数后面,否则会报错SyntaxError: non-keyword arg after keyword arg的 错误.

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())#调用正常

 

  • 函数应该检查参数类型:isinstance()

代码示例:'''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!'))

 

  • 变长参数

  1. 元祖作为可变参数:*

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'))

 

 

  • 函数没有返回值时,print打印返回的就是None

>>> 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)

你可能感兴趣的:(python)