python学习笔记-函数

1. 定义函数

Def 函数名(参数):
			代码块
def sel_func():
    print("显示余额")
    print("存款")
    print("取款")

2. 函数的参数

a,b是形参 10,20 是实参

Def add(a,b):
		Result = a + b
		Print(result)
		
Add(10,20)

3. 函数的说明文档

help(函数名):查看函数的说明文档

定义函数说明文档:
		
		Def 函数名(参数):
			""" 说明文档位置"""
			
			代码
def sumss(a,b):
	    """
	    :param a: 加数
	    :param b: 加数
	    :return: 和
	    """
	    s = a+b
	    return s
	
	
help(sumss)

4.函数嵌套调用

def print_line():
	    print('-' * 20)   #*代表复制   20次 -
	
	print_line()
	
	
	def print_lines(num):
	    i = 0
	    while i < num:
	        print_line()
	        i = i + 1
	
print_lines(10)

5. 变量的作用域

变量的作用域指的是变量生效的范围:全局变量  局部变量

局部变量:定义在函数体内部的变量,即只在函数体内部生效   函数调用完成之后,销毁局部变量

全局变量函数体内外都可以生效的变量

A = 100

Def testb():
	Print(a)


注意:如果在函数内部直接修改全局变量,这个变量仍然是局部变量,修改的是局部变量

如何在函数里面修改全局变量,使用global关键字声明a是全局变量。

6.函数的多个返回值

Def return_num():
		Return 1,2
		
	Result = return_num()
	Print(result)  #(1,2)
	
	
	
	
总结:return 后面可以返回 元组  列表 字典 返回多个值

7.函数的参数

位置参数:根据函数定义的位置参数来传递参数  实参和形参顺序保持一致

关键字参数:通过“键 = 值”形式加一指定
Use_info(name = 'rose',age = 20,gender = 'male')

注意:函数调用时,如果有位置参数,位置参数必须在关键字参数的前面,但是关键字参数不存在先后顺序
User_info('小明',age = 20,gender = 'male')



缺省参数:为参数提供默认值,调用函数不用传递该默认参数的值,所有位置参数必须出现在默认参数之前,

8. 不定长参数

可变参数,用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递



包裹位置参数传递:
def user_info(*args):
    print(args)

#传进去的参数会被args变量收集,他会根据传进去参数的位置合并为一个元组,args是元组类型,这就是包裹位置传递
user_info('tom')
user_info('tom',20)

#元组数据只有一个数据 加上 逗号
('tom',)
('tom', 20)



包裹关键字参数传递:

	#返回一个字典
	def user_info1(**kwargs):
	    print(kwargs)
	
	user_info1(name = 'tom',age = 20)
	user_info1(name = 'xiaoming',age = 30,gender = 'male')

9. 拆包和交换变量值

拆包:元组

def return_num():
    return 100,200  #返回一个元组

num1,num2 = return_num()
print(num1)
print(num2)



拆包:字典
	
dict1 = {'name' : 'tom','age' : 20}
a,b = dict1   #获得是键

print(a)
print(b)

#字典支持 根据键 查找
print(dict1[a])
print(dict1[b])


交换变量的值:
	方法1: temp = a  a = b b = temp
	
	方法2:a,b = 1,2   a,b = b ,a

10.引用类型

在python中,值都是靠引用来传递的

A = 1
B = a

Print(a)


#id 内存地址相同   ab是同一内存地址的不同引用  使用不同的变量名 但是指向相同的变量地址
Print(id(a))
Print(id(b))

A = 2
Prin(b)   #1


#原因:将a修改 将开辟另外一份内存 存储2   那么ab内存地址将不同 
#不同的内存地址   
Print(id(a))
Print(id(b))


列表类型   即使列表修改了  内存地址也是一样的  修改列表不会开辟一份新的内存地址 
aa = [20,30]
bb = aa
print(id(aa))
print(id(bb))

aa.append(33)
print(aa)
print(bb)

print(id(aa))
print(id(bb))


**总结:使用int类型  修改int变量  导致a的内存地址发生变化   但是b的内存地址不会发生变化   使用列表类型,即使修改列表变量,内存地址不会发生变化(修改不会开辟新的内存地址)**

11. 可变与不可变类型

可变类型:数据能够直接进行修改,  不可变类型:数据不能直接进行修改

这里说的直接进行修改 指的是数据在原有的内存地址直接进行修改,那么,不可变 指的是  修改数据 会开辟另一份地址空间,

可变:列表   字典  集合   

不可变: 整数 浮点数  字符串 元组