python-函数

函数:

意义:复用代码,用在需要重复调用的地方。

1
2
3
def somefunction(someargs):
...
return somevalue

1.大部分情况下函数是为了返回一个值的,用return来返回,当然也可以什么都不返回(没有return)。

2.函数传参需要写一些参数到括号中,当然也可以不传参,那么括号中不写参数。

命名规则

全部采用小写,有多个单词时,用下划线连接。私有函数,可以使用下划线开头。

参数修改:

传参之后对参数(传进来的变量)的修改:python中没法通过赋值这种方式来修改参数,只能通过修改参数对象本身的方式。(涉及参数作用域)

函数内部的作用域与函数外部的作用域不同,内部的作用域对函数外部没有影响,前提是不修改值。

如果只是对变量重新赋值,那么是相同值的不同引用,但是如果修改了值,那么函数外部的值也会变化。

如果参数本身不可修改,那么修改参数的方法:将参数变为可变的,比如放入列表中

1
2
3
4
5
6
7
def change_value(x):
x[0]=x[0]+1
return x
#需要将列表作为参数传入:
a=[10]
changeValue(a)
#结果为[11],同时a也被修改为[11]

位置参数,关键字参数

参数分为位置参数和关键字参数,上面的都是位置参数。

关键字参数:使用名称指定的参数

关键字参数的优点:可以设置默认值,所以调用函数可以不传入参数(不会报错),或者传入部分参数都是可以的。

1
2
3
4
5
def total(num1=0,num2=0):
total=num1+num2
return total
print(total()) #返回0
print(total(1,2)) #返回3

收集参数

如果传入参数个数不定,将不定个参数放入元组(参数前面加一个星号)

1
2
3
4
5
6
7
def sum(*num):
sum=0
for i in num:
sum=sum+i
return sum
print(sum(1,2,3))
print(sum(1,3,5,7,9))

星号之前的所有位置参数会放入元组,之后的即使是位置参数,也会被作为关键字参数。

1
2
3
4
5
6
7
8
9
#这个如果没有给出className会报错
def our_class(*studentName,className):
return className,studentName
print(ourclass(1,2,className='one'))

#这个因为已经给了默认值,所以即使不写className也不会报错
def ourClass(*studentName,className='xiaofendui'):
return className,studentName
print(courclass(1,2))

如果要将关键字参数也放入元组,那么加两个星号

1
2
3
4
def courclass(**studentname,classname='xiaofendui'):
return classname,studentname
def ourclass(**studentname,classname):
return classname,studentname

分解参数

前面写的是函数如何接受不确定个数的参数,但是如果传进来的参数是一个数组或者字典呢?同样也可以在传入参数中分解参数

1
2
3
4
a=(1,2)
def count(x,y):
return x+y
print(count(*a))

一个星号可以分解数组,两个星号可以分解字典

作用域

namespace调用每一个函数时都会创建一个局部命名空间,只要不修改传入变量的值,函数外部的变量不会变。

函数中可以调用全局变量,但是普通的直接调用容易引起问题,比如函数中存在同名参数或变量。所以需要global访问全局变量。

1
2
3
4
5
6
7
import datetime as dt

today=dt.datetime.now().strftime("%F")
def get_time():
return globals()["today"]
print(get_time())
2019-11-14

函数内部改变外部变量的方法除了前面说的改变值本身之外,还可以显式的引用全局变量

1
2
3
4
5
6
7
8
9
x=2
def change():
global x
x+=1
return x
print(change())
3
print(x)
3

闭包

1.嵌套在函数中的内部函数。

2.外部作用域的变量可被内部函数使用

3.修改外部作用域变量使用nonlocal

1
2
3
4
5
def mult(a):
def plus(b):
return a * b #不能挨着写????
return plus
print(mult(2)(3))