python基础语法 005 函数1-1

1 函数

1.1 什么是函数

指:输入一定的数据以后,能根据里面的执行步骤,算出一些数据的值;得到相关的数据,获取对于的输出值。

存储指定功能的程序,进行相应的复用

解释:

  • 洗衣服 ==》输入值(洗衣粉,脏衣服,水) ==》(干净的衣服)

  • 橘子题:输入值:单价、重量;==》输出:价格

1.2 函数的定义

函数在python中怎么定义?怎么使用?

1) 怎么定义? 

def (空格) 函数名称(函数的参数1,参数2,参数3..):
    """文档字符串 docstring
    函数的注释,这个函数是干嘛用的,
    参数:
    返回值:    
    """
    (缩进)函数体(函数具体执行的逻辑)
    return 函数的返回值(输出)



#例子
#加法
def add(a, b):
    """两数相加"""
    c = a + b
    return c

2) 怎么使用?

#函数的调用
#a = 1, b =2
add(a = 1, b = 2)

add(1, 2)

#任何判断函数语句执行了,可以加一些日志打印如:
def add(a, b):
    """两数相加"""
    print("函数正在执行")
    c = a + b
    return c

3) 怎么获取结果?

#如何获取最后的结果?
#怎么显示
#print 和 return区别
#print:显示在屏幕上,打印出来
#return:函数运算的结果,获取结果以后不一定会打印出来,仅获取结果,需要给return在赋值一个变量,再print打印出这个变量

print(add(1, 2))


#使用变量接收
res = print(add(3, 5))
print(res )

1.3 函数的作用:

  • 实现某个指定的功能,可以重复使用
  • 提高代码的复用性,不用写很多重复代码
  • 函数还能通过命名增加可读性
  • 可以隐藏大量的逻辑
#例子:足球队招人
#当发现在复制、粘贴相同的或者类似代码的时候,则极有可能需要定义一个函数
#把同样的一段代码存储到函数当中 ===> 封装
#封装成函数(盒子)  ===》把一段代码存储到函数当中
#函数的作用:存储一段程序(有长有短),提高代码的复用性
#函数不会存储变量、数据,变量一般放在外面===》实际参数,变量一般是会变的作用
#实际参数是这样被提取出来:当封装函数的时候,通常会有一些变化的东西(数据)
#什么时候封装函数:重复使用

def join_team(age, gender):
    if (18 < age < 22) and gender == '女':
        print("请开始训练")

age = 17
gender = '男'

join_team(age, gender)

1.4 函数的参数

思考:

  • 为什么要加参数
  • 参数的个数、类型
  • 多个参数和调用的顺序

1.4.1 形式参数、实际参数、位置参数

#or_list = ['abc']
#ele = '小一'
形式参数:函数在定义的时候写的参数,没有意义只是占坑的,即变量名 or_list , ele
实际参数:函数在调用的时候写的参数,是个值                  =['abc']  ='小一'
位置参数:形式参数和实际参数要一一按照顺序对应,不多不少,位置一样

1.4.2 默认参数

默认参数:在函数定义的时候,给形式参数一个默认值,即缺省值
        如果有默认值,在函数调用时,如果位置参数一一对应,传入了实际参数,默认参数不会生效
        如果没有传入实际参数

  • 作用1:如果没有传入实际参数,则默认值会生效
  • 作用2:可以简化函数的调用过程,只需要传入少量参数就可以实现调用过程
  • 作用3:默认参数必须放到位置参数的后面

#为什么要写默认参数
def append(or_list, ele = '哇哈哈'):
    """对列表进行数据添加"""
    or_list.append(ele)
    return  or_list

print(append(['abc'], '小一')) #['abc', '小一']

###################作用2#############################3
#没有传ele,默认ele为默认值
print(append(['abc']))  #['abc', '哇哈哈']

def get_name(firstname, lastname = ''):
    return  firstname + lastname

print(get_name("周", "杰伦")) #周杰伦
print(get_name("周", )) #周

#################作用3:默认参数必须放到位置参数的后面############################3333
def get_name(firstname = '', lastname):
    return  firstname + lastname

print(get_name("周", "杰伦"))
#SyntaxError: non-default argument follows default argument
#print(append(['aaa']))   #报错,缺少位置参数ele
#TypeError: append() missing 1 required positional argument: 'ele'

#print(append(['aaa'], '小一', '小二'))  #报错,需要2个位置参数,但给了3个
#TypeError: append() takes 2 positional arguments but 3 were given

print(append('小一',['aaa'])) #报错,顺序不一样,顺序要保持一致
#AttributeError: 'str' object has no attribute 'append'

1.4.3 关键字参数:关键字参数也要放到位置参数的后面

关键字参数:

  • 作用1:还是相对于位置参数讲的,

        可以提高函数调用时的可读性,更加容易理解实际参数的意义
        关键字的名字  === 》 形式参数来的
        原因:参数多的时候,搞不清楚位置

  • 作用2:关键字参数区别位置参数:可以不按照顺序进行调用,可以交换顺序

def get_name(firstname , middle,  lastname= ''):
    return  firstname + middle +lastname

print(get_name("周", middle='最棒', lastname = "杰伦")) #周最棒杰伦

print(get_name("周", lastname = "杰伦",middle='最棒')) #周最棒杰伦

##作用3:关键字参数也要放到位置参数的后面
print(get_name( lastname = "杰伦", "周", middle='最棒')) 
#SyntaxError: positional argument follows keyword argument

1.4.4 可变长参数

  • 指明:不知道这个函数多少个参数
  • 不需要每个参数都传入,可以选择传不传
  • *, **
  • 打印时元组
  • 星号放在函数调用里面
  • 两个星号表示关键字和字典
1 ) *arg
"""
可变长参数:
表示形式:
    *names,在函数内部的表现形式:names是元组
        可以接收从函数调用的时候,多余的位置参数
    *names, 加在其他的位置参数的后面

可以只有一个 *names,可以的
"""
def get_name(firstname, *names):
    """获取名字"""
    print(firstname)
    print(names)
    return  firstname

get_name('xiaoyi')
"""结果
xiaoyi
()
"""
get_name('xiaoyi', 'good','ok')

"""结果
xiaoyi
('good', 'ok')
"""

#可变长参数放在固定参数的前面会怎么样
def get_name( *names, firstname):
    """获取名字"""
    print(firstname)
    print(names)
    return  firstname

get_name('xiaoyi', 'good','ok')

"""结果
    get_name('xiaoyi', 'good','ok')
TypeError: get_name() missing 1 required keyword-only argument: 'firstname'

"""


#有一个*names
def get_name(*names):
    """获取名字"""
    print(names)

get_name('xiaoyi', 'good','ok') #('xiaoyi', 'good', 'ok')

#有一个2个 *names
def get_name(*names, *names):
    """获取名字"""
    print(names)

get_name('xiaoyi', 'good','ok')

"""结果 
SyntaxError: invalid syntax
"""
2) **kwargs
"""
**kwargs, keyword args 关键字不定长参数
关键字参数只能放在位置参数的后面
"""

def get_name(*names, **kwargs):
    """获取名字"""
    print(names)
    print(kwargs)

get_name('xiaoyi', 'good','ok')
"""结果
('xiaoyi', 'good', 'ok')
{}
"""

get_name('xiaoyi', 'good','ok', middle = 'hello', yit = 'world')

"""结果
('xiaoyi', 'good', 'ok')
{'middle': 'hello', 'yit': 'world'}
"""

get_name('xiaoyi', 'good','ok', middle = 'hello', yit = 'world', yit = 'yyy')
"""结果
SyntaxError: keyword argument repeated: yit
"""

1.5 函数的返回值

return

  • 中止函数
  • 条件控制的中止
  • return 可以有多个,用逗号隔开,返回的格式为元组
  • 作用:拿到返回值做进一步处理
  • 默认return None,
  • 无return ,默认返回None

#函数里面return 表示函数的返回值,可以在调用函数之后通过变量进行接收
#return 知识点2:函数体遇到return就终止运行,相当于for的break
"""
return:
1,函数遇到return就终止
2、函数的返回值return,函数调用以后可以通过变量接收return值,
函数的输出数据是由return 决定的
"""

#例子:
def add(a, b):
    if a > 100:
        return  a + b
    elif a == 100:
        return  a + 2*b
    else:
        return a + 3 * b

print(add(3, 10)) #33

#例子3 if很多的时候,可以巧妙运用return的方式去终止函数
def add(a, b):
    if a > 100:
        return a + b
    return a + 3 * b

print(add(111, 10))#121

#例子4:打印None
#函数调用后得到的数据是由return决定的,
# 函数没有return,得到的数据就是None
def add(a, b):
    c = a + b


print(add(3, 10)) #None


#append
# my_list = ['abc', 'end']
# a = my_list.append('current') #这里指方法
# print(a)

#自己实现一个append
def append(or_list, ele):
    """对列表进行数据添加"""
    or_list.append(ele)
    return  or_list

print(append(['abc'], '小一'))  #['abc', '小一']

函数:一定要掌握的知识:

  • return 
  • 函数的形式参数
  • 函数的实际参数
  • 函数的位置参数
  • 默认参数:简化调用过程
  • 关键字参数:可以交换参数的顺序,并且提高可读性
  • 可变长参数

1.6 函数之间的调用 

"""
函数之间的调用,在一个函数去用另外一个函数

#eat放在congratulat也可以运行,和python运行的代码有关系

只有函数调用了才会执行缩进的代码
若把eat放在函数调用的后面,就会报错,因为eat还没定义
即调用函数之前必须把函数定义号,与函数定义的顺序无关
"""

def congratulate(name,money,food):
    """
    庆祝宴席
    :return:
    """
    print("{}宴席花了多少:{}".format(name,money))
    #请客
    eat(name, food)


def eat(name, food):
    print("{}喜欢吃食物:{}".format(name,food))

eat('xiaoyi','apple')
congratulate('小王子', 100, 'milk')

小心递归函数使用,导致死循环,函数不要相互调用,除非熟练

def get_money(date):
    get_name('xiaoyi', "wang")
    return "我在{}h号获取".format(date)

def get_name(firstname, lastname = ''):
    get_money(7)
    return firstname + lastname

print(get_money(7))

"""结果
RecursionError: maximum recursion depth exceeded

"""

最好不要自己调自己,容易造成递归错误

def get_money(date):
    print("小一")
    get_money(7)
    print("hello")
    
print(get_money(8))

#RecursionError: maximum recursion depth exceeded while calling a Python object

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值