Python学习之路-函数

1.初始函数

在没有函数之前,我们是怎么实现一段代码的呢?我们之前学了len()方法,可以求出一个列表的长度,假如现在没有len()方法,那我们要自己写一个类似功能的代码来实现求一个列表的长度。

代码如下:

list = [1,2,3,'hello','abc']

count = 0

for i in list:

  count +=1

print (count)

这段代码实现了len()的功能,但是如果一个程序里有n多需要测试长度的地方,我们需要黏贴n遍这样的代码,所以这样的操作有什么缺点呢?

1. 重复代码多

2.可读性差

2. 创建函数

我们通过定义一个函数,就能解决以上两个问题。

s1 = 'hello world!!!!'
def my_len():
count = 0
for i in s1:
count += 1
# print(count)

my_len()

2.1 函数的语法格式
def 函数名(参数1,参数2,参数3,...):
    '''注释'''
    函数体
    return 返回的值
注意:函数名要能表达出这个函数的作用和意义

2.2 如何运行一个函数

函数名加上括号()调用一个函数,就是执行函数

my_len()
2.3 函数运行遵循的原则
原则:先定义,再调用
  1. 函数名,就是一个变量名
  2. 变量必须先定义后引用,所以如果没有定义函数,而直接去引用这个函数,就相当于在引用一个不存在的变量名
  3. 函数体内,不要用print()方法,用return返回值代替,目的是让函数完成最小的功能,不让函数做额外的操作
2.4 函数的返回值return
作用1:返回值的作用:函数执行时,当遇到返回值return是就结束函数
代码:
def func1():
print(11)
print(22)
return
print(333)
print(444)
func1()

作用2:返回值会返回给给函数的调用者(执行者)
  • 函数体内的代码部分可以不写return,则返回值默认是None
  • 返回值写成return None,则返回值是None
  • return 后接单个值
  • return 后接多个值,多个值会放在一个元组中返回给函数的调用者
举例:return 后接单个值
def my_len():
count = 0
for i in s1:
count += 1
return 666
print(my_len(),type(my_len()))

举例:return 后接多个值
def my_len():
count = 0
for i in s1:
count += 1
return 666,222,count,'中国'
print(my_len(),type(my_len()))

举例:return 后接多个值,且赋值给多个变量
def my_len():
count = 0
for i in s1:
count += 1
return 666,222,count
ret1,ret2,ret3 = my_len() # (666, 222, 19,)
print(ret1)
print(ret2)
print(ret3)

3. 函数的参数
定义函数时的括号就是放置函数参数的地方,这时的参数叫形式参数,简称形参,例如:def my_len(a,b) #括号中是定义参数的地方
如果定义函数时有形参,调用函数时括号里面也要写参数,这是的参数叫实际参数,简称实参,例如:my_len (1,2) #括号里面的实参,就是实际的数

3.1 实参的种类
  1. 位置参数
    要求:必须按顺序传参,必须一一对应
    举例:
    def func1(x,y):
    print(x,y)
    func1(1, 2)
  2. 关键字参数
    要求:不分顺序,必须一一对应
    举例:
    def func1(x,y,z):
    print(x,y,z)
    func1(y=2,x=1,z=5,)
  3. 混合参数(位置参数+关键字参数)
    要求:关键字参数必须在位置参数后面,必须一一对应
    举例:
    def func2(argv1,argv2,argv3):
    print(argv1)
    print(argv2)
    print(argv3)
    func2(1,2,argv3=4)

3.2 形参的种类

  1. 位置参数
    要求:必须按顺序传参,必须一一对应
    举例:
    def func1(x,y):
    print(x,y)
    func1(1,2)
  2. 默认参数
    要求:必须放在位置参数后面
    注意:

    如果有一个形参有默认参数,实参在传参时可以不传,函数运行时会自动识别默认参数的值。

    如果实参对于形参的默认参数传递了新值,那么新值会覆盖了默认参数的值

    举例:统计姓名
    def register(name,sex='男'):
    with open('register',encoding='utf-8',mode='a') as f1:
    f1.write('{} {}\n'.format(name,sex))

    while True:
    username = input('请输入姓名:/q 或者 Q 退出') #传参时可以不传sex
    if username.upper() == 'Q':break
    if 'a' in username:
    sex = input('请输入性别:') #程序运行中给sex参数重新赋值
    register(username,sex)
    else:
    register(username)
  3. 动态参数(万能参数)
    格式:
    def my_len(*args, **kwargs)
    作用:
    在某种情况下,实参传值的个数是不固定的,为了保证程序运行,形参需要能接收多余的实参

    形参中的*args,作用是接收实参角度的所有多余的位置参数,并把它们放到一个元组中

    形参中的**kwargs,作用是接收实参角度的所有多余的关键字参数,并把它们放到一个字典中

    举例:
    def func2(*args,**kwargs):
    print(args) # 元组(所有位置参数)
    print(kwargs) #字典(所有关键字参数)
    func2(1,2,3,4,5,6,7,11,'john','中国',a='ww',b='qq',c='222')

4. 参数的顺序
  1. 位置参数-*args-默认参数
    举例:
    def func3(a,b,*args,sex='男'):
    print(a)
    print(b)
    print(sex)
    print(args)
    func3(1,2,'中国','tom','jerry',sex='女')
  2. 位置参数-*args-默认参数-**kwargs
    举例:
    def func3(a,b,*args,sex='男',**kwargs):
    print(a)
    print(b)
    print(sex)
    print(args)
    print(kwargs)
    func3(1,2,'中国','tom','jerry',name='jack',age=46)

5. 打散和聚合功能
  1. 实参位置: 加*或**是打撒功能
  2. 形参位置:加*或**是聚合功能
    举例:

    def func1(*args,**kwargs): # 函数的定义 * 聚合。
      print(args)
  print(kwargs)

   l1 = [1,2,3,4]
   l11 = (1,2,3,4)
   l2 = ['tom','jack',4]
   func1(*l1,*l2,*l11) # 函数的执行:* 打散功能。

 
 
 







  

猜你喜欢

转载自www.cnblogs.com/airkoala/p/8984633.html