今日总结

  • 函数的定义与调用
  • 函数的分类
  • 函数的返回值
  • 函数的参数

今日内容详细

1.函数的定义与调用

函数一定要先定义然后再调用,只有定义之后才有的调用,在定义的时候不会执行代码,只会检测语法,函数体代码只有在被调用的时候才会被执行。函数名其实就类似于变量名在内存中指向函数体代码的位置。
调用函数的方式:函数名加小括号>>>>>>>>>>如果括号里有参数就传统参数
# def func():
	print('hello world')
func()就是去内存中找到函数体代码并执行

2.函数的分类

函数分为两类,一类是内置函数,一类是自定义函数。
#1.内置函数:就是python解释器提前定义好了的函数,可以直接调用。如:len,open,print等。
#2.自定义函数:就是我们自己定义的函数,里面又有三种函数,无参函数,有参函数和空函数。
2.1.无参函数就是在函数定义阶段括号内没有参数。
	def index():
        print('嘿')
        index()>>>>>>>>>>>>括号内也不需要写参数
2.2.有参函数就是在函数定义阶段括号内有函数
	def index(a):
        print('嘿',a)
        index(123)>>>>>>>>>>>>括号内也需要写参数	
2.3.空函数就是在函数定义阶段函数体代码是用pass或者...占位
	def index():
        pass
    # 空函数前期能够快速的罗列出程序中的大致功能,让程序整体框架清晰,所以很多项目的功能框架搭建都会使用

3.函数的返回值

3.1.函数的返回值就是调用函数之后返回的结果.eg:
	  s = 'hello world'
      res = len(s)
      print(res)
   里面就是将len函数的返回值赋值给res
3.2.如何获取函数的返回值
	变量名 = 函数调用
3.3.操作返回值
3.3.1.当函数体代码没有reyurn关键字的时候,返回值就是None.eg:
		def index():
        	print('嘿')
         res = index()
        	print(res)>>>>>>>>>>>>>结果是None
3.3.2.当函数体代码写了return但是没有跟任何值的时候,返回值也是None。eg:
		def index():
        	print('嘿')
            return
        	res = index()
            print(res)>>>>>>>>>>>>结果是None
3.3.3.当函数体代码写了return并且跟了数据,那么写什么就返什么.
		如果写的是值那么直接返回值(任意数据类型).
    	如果写的是变量名那么返回变量名指向的值.eg:
		def index():
    		print('嘿')
    		name = 'jason'
    		return name
    		res = index()
    		print(res)>>>>>>>>>>>>结果是jason
 3.3.4.return后面还可以有多个值,会自动生成元祖然后返回。eg:
		def index():
    		print('嘿')
    		return 111,222,333
    	res = index()
    	print(res)>>>>>>>>>>>>>>>结果是(111,222,333)
 3.3.5.函数里的return就像循环里的break一样,遇到就会结束。

4.函数中的参数

# 函数中的参数可以分为两大类
1.形参就是函数在定义阶段括号里写的参数,我们称之为形式参数
2.实参就是函数在调用阶段括号里写的参数,我们称之为实际参数
# 形参与实参之间的关系
形参类似于是变量名、实参类似于是变量的值在调用函数的时候传入实参 会与形参临时绑定
函数运行结束之后自动解除绑定。eg:
	def index(a,b):>>>>>>>>>a和b就是index函数的形参
   		 print(a,b)
	 index(1,2)>>>>>>>>>>>>>12就是index函数的实参
    
# 位置参数
位置参数里面又分为位置形参和位置实参,位置形参与位置实参个数一定要一致,多或少都不行
位置形参和位置实参在关系上就是从左往右依次绑定。
位置形参就是在定义函数的时候括号内从左往右依次填写的变量名。eg:
    def index(name,pwd):
        pass
  里面的name和pwd就是位置形参
位置实参就是在调用函数的时候从左往右依次传入得真实数据。eg:
    index('jason',123)
    里面的jason和123就是位置实参
    
    
# 关键字参数
指名道姓的给形参传值,不用遵循位置,所以只会出现在实参中,但是一个实参只能绑定一个形参的值eg:
    def index(a,b):
        print(a,b)
	index(b=111, a=222)  # 指名道姓的说形参a接收数据222 b接收数据111
	index(b=333,222)  # 报错 关键字参数必须放在位置参数的后面
	index(222,a=111)  # 报错 形参只能指向一个实参
	index(222,b=111)  # 可以 相当于位置参数 
    
    
# 默认参数
出现在形参中,在定义函数的时候就已经给一些形参赋值了,如果后面不传值的话就会默认,如果传的话就用传的值,默认参数的出现打破了形参与实参之间个数一致的情况,默认参数必须定义在位置参数的后面。
eg:
	def register(name, age, gender='猛男'):
 		print("""
    	学员姓名:%s
    	学员年龄:%s
    	学员性别:%s
    	""" % (name, age, gender))
register('jason', 18)  # 不传就使用默认的
register('kevin', 28)
register('jerry',22,'美女')  # 传了就使用自己的

# 可变长参数
# 就是定义一个函数,无论传多少位置实参都可以正常执行(*号)。eg:
	def func(*a):
    	print(a)
	func()  # ()
	func(1,2)  # (1, 2)
	func(1,2,3,4,5,6)  # (1, 2, 3, 4, 5, 6)
# *号在形参中可以接收多余的位置参数 并组织成元组的形式赋值给*号后面的变量名。eg:
	def index(a, b, *ag):
    	print(a, b, ag)
	index(999)  # 会报错  因为形参ab的存在 意味着index最少要给两个参数
	index(1, 2)  # 1 2 ()
	index(1, 2, 3, 4, 5, 6, 7)  # 1 2 (3, 4, 5, 6, 7)
	index(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)  # 1 2 (3, 4, 5, 6, 7, 8, 9, 10)
# 需求:定义一个函数 无论传入多少关键字参数都可以正常执行.eg:
	def func(**k):
   	 	print(k)
	func()  # {}
	func(a=1,b=2)  # {'a': 1, 'b': 2}
	func(a=1,b=2,c=3,d=4)  # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
 # **在形参中用于接收多余的关键字参数 并且组织成字典的形式赋值给**后面的变量名.eg:
	def index(a, b, **k):
    	print(a, b, k)
	index(a=1, b=2)  # 1 2 {}
	index(a=1, b=2, c=3, name='jason')  # 1 2 {'c': 3, 'name': 'jason'}
	index(1,2,name='jason',age=18,pwd=123)  # 1 2 {'name': 'jason', 'age': 18, 'pwd': 123}
    
    
    
 # 可变长形参
如果不确定一个函数将来需要多少个实参,可以采用'def index(*a,**k)'这个方法。eg:
	def func(*a,**k):
    	print(a,k)
	func()  # () {}
	func(1,2,3,4,name='jason',age=18)  # (1, 2, 3, 4) {'name': 'jason', 'age': 18}
    
    
# *和**不仅可以在形参中使用,也可以在实参中使用
*号在实参中是将列表或元祖打散成位置参数一一传入,相当于*号会将列表和元祖的括号给去掉,暴露里面的一个个元素。eg:print(*[1,2,3])>>>>>>>>>>print(1,2,3)
# **号在实参中就是将字典打散成关键字一一传入。eg:def index(**{'age':18})>>>>>>>>>index(age=18)