python函数

python函数

一、函数的初识

特点:

  • 关键字 def,固定不可变
  • def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。
  • 函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并且要具有可描述性

优点:

  • 可读性高
  • 降低代码重复性

函数的结构:

#基础
def 函数名():
    函数体   
#调用
函数名()
---------------------------------

#有参函数
def 函数名(参数1,参数2):
    函数体
#调用
函数名(传参1,传参2)

---------------------------------
#有返回值的函数,return后面的代码不会执行
def 函数名():
    函数体 
    return

例子:
def meet():
    print('打开')
    print('爱你')
    print('不爱你')
    print('关闭')
meet()

#return 也可以输出出来
def meet():
    print('打开')
    print('爱你')
    print('不爱你')
    print('关闭')
    return 'aaa'
ret = meet()
print(ret)


二、函数参数具体介绍

2.1、形参、实参

def sum(a):  #形参:形式上的参数---函数定义时的命名的参数
    print(a)
sum(1)		 #实参:实际上的参数---函数调用时传入的参数

2.2、实参之位置参数

  • 从左至右一一对应,也就是定义了几个形参就得传递几个实参
def max(a,b):
    if a > b:
        print(a)
    else:
        print(b)
max(1,2)

#三元运算符:c 等于a,如果a大于b,c就等于a,否在c等于b
c = a if a > b else b

2.3、实参之关键字参数

  • 调用的时候,把实参一 一复制给形参(可不对应)
def max(a,b):
    print(a>b)
max(b=1,a=2)

2.4、实参之混合参数

  • 调用的时候,把上面2种混合用
  • 注意:位置参数一定得在关键字参数前面!!!
def max(a,b,c,d):
    print(a>b)
max(a=1,b=2,4,5)


2.5、形参的传参之普通传参

def max(a,b,c,d):
    print(a>b)
max(a=1,b=2,4,5)

2.6、形参的传参之可变长度参数(万能参数)

  • 一个*
  • 以*开头代表着一个任意长度的元组,可将一连串参数都放到一个元组中
  • *有拆开元组、列表的作用
def self_print(name,*a):
    print(a)
    print(type(a))
self_print(1,2,3,4,5)
此时name=1,*a=2,3,4,5


#拆开元组、列表
t=(1,2,3,4,5)
print(*t)
def f(*tt):
    print(tt)
f(*[1,2,3,4,5])
>>>
1 2 3 4 5
(1, 2, 3, 4, 5)
  • 二个*
  • 以**开头代表着一个字典,参数的形式是“key=value”,可以接受连续任意多个参数
  • **有拆字典的作用
def d_self_print(**kwargs):
    print(kwargs)
    print(type(kwargs))
d_self_print(last_name="dsf",first_name="Af")

{'last_name': 'dsf', 'first_name': 'Af'}
<class 'dict'>

#补充
def func(*args,**kwargs):
    print(args)			#打印出来的是元组
    print(kwargs)		#打印出的的是字典
func()

#拆字典
def ff(**kwargs):
    print(kwargs)
ff(**{'name':'zhangsan','age':20})
>>>
{'name': 'zhangsan', 'age': 20}


2.7、形参的传参之默认参数

  • 定义函数时为参数提供默认值,调用函数时可传也可不传该默认参数的值
  • 所有必须参数必须出现在默认参数前,包括函数定义和调用
  • 当缺省参数没有传入,默认值会生效

如果想同时使用:参数的最终位置:(a,b,*args,sex='男',**kwarg

(* **做为形参的时候是聚合,作为实参是打散)

def f(name, age, sex = 'male' ):
    print('I am %s , I am %d years old'%(name, age))
    print('Sex : %s'%sex)

#不传参,用默认的
f(name='李四', age=19) 
#传参,用传入的
f('张三', 88, sex='female')

三、命名空间(名称空间)

3.1、命名空间分类

1. 全局命名空间--> 我们直接在py文件中, 函数外声明的变量都属于全局命名空间

2. 局部命名空间--> 在函数中声明的变量会放在局部命名空间

3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

3.2、执行顺序

​ 内置名称空间 ----> 全局名称空间 ----> 局部名称空间

3.3、取值顺序

​ 就近原则:先从局部名称空间---->到全局名称空间---->内置名称空间

​ 单向不可逆:外面的取不了函数里面的

3.4、作用域

​ 1、全局作用域:包括内置名称空间、全局名称空间

​ 2、局部作用域:局部名称空间(函数里面的呗)

面试题:问为什么抱错啊?

count = 1
def fun():
    count += 1
    print(count)
fun()

#解决方法
global  count
count = 2
def fun():
    global count
    count += 2
    print(count)
fun()

答案:1、局部作用域不能改变全局作用域(只能引用不能改变)

​ 2、当python解释器读取到局部作用域时,发现你对一个变量进行修改的操作,解释器会认为你 在局部已经定义了这个局部变量,他就会从局部找这个局部变量,找不到报错了!

四、高阶函数(函数的嵌套

image-20200902010347695

image-20200902010607578

image-20200902010807585

五、内置函数

​ 内置函数介绍:就是python封装好的函数、用的时候直接调用就可以了

一带而过:all() any() bytes() callable() chr() complex() divmod() eval() exec() format() frozenset() globals() hash() help() id() input() int() iter() locals() next() oct() ord() pow() repr() round()

重点1:abs() enumerate() filter() map() max() min() open() range() print() len() list() dict() str() float() reversed() set() sorted() sum() tuple() type() zip() dir()

重点2: classmethod() delattr() getattr() hasattr() issubclass() isinstance() object() property() setattr() staticmethod() super()

六、关键字:global

global:
global第一个功能:在局部作用域中可以更改全局作用域的变量。

count = 1
def search():
    global count
    count = 2
search()
print(count)

利用global在局部作用域也可以声明一个全局变量。

def func():
    global a
    a = 3
func()
print(a)

所以global关键字有两个作用:

1,声明一个全局变量。

2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。

七、关键字nonlocal

nonlocal是python3x新加的功能,与global用法差不多,就是在局部作用域如果想对父级作用域的变量进行改变时,需要用到nonlocal,当然这个用的不是很多,了解即可。

def add_b():
    b = 42
    def do_global():
        b = 10
        print(b)
        def dd_nonlocal():
            nonlocal b
            b = b + 20
            print(b)
        dd_nonlocal()
        print(b)
    do_global()
    print(b)
add_b()

nonlocal关键字举例

nonlocal的总结:

1,不能更改全局变量。

2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

原文地址:https://www.cnblogs.com/hsyw/p/13605248.html