第九节:函数(二)

函数(二)

在这里插入图片描述

不定长参数

  • 定义函数时,可以在形参前面加一个*,这样这个形参可以获取到所有的实参,它会将所有的实参保存到一个元组中
  • 带*号的形参只能有一个,可以和其他参数配合使用
  • *形参只能接受位置参数,不能接受关键字参数
def fun(a ,c= 2,*b):
    print(a,b,c)   
fun(2)			# 得 2 () 2
fun(2,3)		# 得 2 () 3
fun(2,3,4)		# 得 2 (4,) 3
fun(2,3,4,5)	# 得 2 (4, 5) 3
fun(2,3,b =4)   # 报错,*形参只能接受位置参数,不能接受关键字参数
  • **形参可以接收其他的关键字参数,它会将这些参数统一保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值
  • **形参只能有一个,并且必须写在所有参数的后面
def fun(*b,a =2,**c): # 带*号形参放在开头,其他参数必须以关键字参数表现
    print(a,b,c)	  # 要么形参指定默认值,要么实参放在位置参数后面,不然会报错
fun(2,3,4)					# 得 2 (2, 3, 4) {}
fun(2,3,4,5)				# 得 2 (2, 3, 4, 5) {}
fun(2,3,4,5,a =3)			# 得 3 (2, 3, 4, 5) {}
fun(2,3,4,c=3,d=7)			# 得 2 (2, 3, 4) {'c': 3, 'd': 7}
fun(2,3,4,c=3, a=3,d=7)		# 得 3 (2, 3, 4) {'c': 3, 'd': 7}

参数的解包

  • 传递实参时,也可以在序列类型的参数前添加星号,这样它会自动的将序列中元素依次作为参数传递
  • 要求序列中的元素的个数必须和形参的个数一致
def fun(b,a ,c):
    print(a,b,c)
fun(*'123')							# 得 2 1 3	(字符串解包)
fun(*[1,2,3]) 						# 得 2 1 3  (列表解包)
fun(*[1],2,*[3])					# 得 2 1 3  (多*解包,Python3.5以上版本支持)
fun(*(1,2,3))						# 得 2 1 3	(元组解包)
fun(*{'a' : 1,'b' : 2,'c' : 3})		# 得 b a c	(字典key解包)
fun(**{'a' : 1,'b' : 2,'c' : 3})	# 得 1 2 3	(字典value解包)

函数的返回值

  • 返回值就是函数执行以后返回的结果
  • 通过return来指定函数的返回值
  • return后面可以跟任意对象,返回值甚至可以是一个函数
def ftoc(f):
    c = (f - 32) / 1.8
    # print('%.1f'%c)
    return c  # return后面可以跟任意对象,返回值甚至可以是一个函数
# ftoc(98)
t = '%.1f'%ftoc(float(input('请输入你的体温:'))) + '℃'
print(t)  # 输入 98 返回值 36.7℃

文档字符串

  • help()是Python中内置函数,通过help()函数可以查询Python中函数的用法
  • 在定义函数时,可以在函数内部编写文档字符串,文档字符串就是对函数的说明
  • 长字符串:’’’ ‘’’
  1. 保留文本格式
  2. 作为一个多行注释
# 文档字符串:对函数以及类的说明及功能介绍
def print(self, *args, sep=' ', end='\n', file=None): # known special case of print
    """
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    
    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.
    """

函数的作用域

• 作用域(scope) :指的是变量生效的区域

# 块级作用域
# Python中是没有块级作用域的,代码块里的变量,外部可以调用
if 1 == 1:
    name = "老王"
print(name)  #  老王

• 在Python中一共有两种作用域

  • 全局作用域
name = "老王"
def f1():			# f2()执行结果为函数f1的内存地址,即ret=f1;
    print(name)		# 执行ret()等同于执行f1(),执行f1()时与f2()没有任何关系,
def f2():			# name=“老王”与f1()在一个作用域链,
    name = "老张"	# 函数内部没有变量是会向外找,所以此时变量name值为“老王”
    f1()
f2() # 得 老王

• 全局作用域在程序执行时创建(顶格写),在程序执行结束时销毁
• 所有函数以外的区域都是全局作用域
• 在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问

  • 函数作用域
name = "老王"
def f1():
    name = "老张"
    def f2():
        name = "老李"
        print(name)
    f2()
f1()  # 得  老李  在函数未执行之前,作用域已经形成了,作用域链也生成了

• 函数作用域在函数调用时创建,在调用结束时销毁
• 函数每调用一次就会产生一个新的函数作用域
• 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问

命名空间

  • 获取当前作用域的所有变量,并且以一个字典的形式返回出来
a = 1
b = 2
c = 3
s = locals()
print(s)  # 得 {'a':1, 'b':2, 'c':3}

作业

  • 1.用函数实现一个判断用户输入的年份是否是闰年的程序
    1.能被400整除的年份
    2.能被4整除,但是不能被100整除的年份
    以上2种方法满足一种即为闰年
def fun(year):
    if year % 400 == 0 or (year % 100 != 0 and year % 4 == 0):
        print('你输入的是闰年')
    else:
        print('您输入的不是闰年')
fun(1924)		# 得 输入的是闰年

声明:本文为学习笔记,转载请标明出处,本文仅供交流学习,请勿用于非法途径,希望本文对大家有帮助。

仅是个人意见,如有不足之处或者侵权,请留言!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值