python[函数]学习记录

11-05

局部变量

变量的作用域是它被定义的块,从定义它们名字的定义点开始。

x=50
def func(x):
    print('x is',x)
    x=2
    print('Changed local x to',x)
func(x)
print('x is still',x)

输出的结果为:
x is 50
Changed local x to 2
x is still 50

它是如何工作的:
调用函数时,第一个print,x接收到的是函数声明之上的主代码模块中的值
第二个print,在函数内,x被赋予值2,所以打印出来2。
函数之后,第三个print,展示的仍然是主代码模块中的值,不受函数中x值的变化的影响。

global语句

x=50
def func():
    global x
    print('x is',x)
    x=2
    print('Changed global x to',x)
func()
print('Value of x is',x)

输出的结果为:
x is 50
Changed global x to 2
Value of x is 2

它是如何工作的:
可以看到,跟上个运行结果的不同就是,最后在主模块中调用的print得出的x,竟然收到了函数的影响。所以global的作用就是把变量变为全局变量,这就是跟local区别的地方。

默认参数值

有时候我们需要为一些方法的参数提供默认值并让它可选,以避免用户不想为它们提供值的情况。
可以定义函数时,采用赋值运算符 = 来为参数提供默认值。

要注意的是默认参数值应该是常数,确切来说应该是不可变的,以后会解释。

#默认参数值
def say(message,times=1):
    print(message*times)
say('hello')
say('world',5)

运送结果是:
hello
worldworldworldworldworld

注意,只有那些位于参数列表末尾的参数才能被赋予参数默认值。
这是因为值是按照参数所处的位置依次分配的。系统会搞不清楚哪个值分配给哪个参数。

关键字参数

如果一个函数有很多参数,又希望只对其中的一些进行指定,可以通过命名它们来给这些参数赋值,这就是关键字参数(Keywords Arguments),我们使用命名而非位置来指定函数中的参数。
这样做有两个好处:

  • 不再需要考虑参数顺序,函数使用更加容易
  • 可以对那些我们希望赋予的参数赋值,只要其他参数有默认参数值。
def func(a,b=5,c=10):
    print('a is',a,'b is b',b,'c is',c)
func(3,7)
func(25,c=24)
func(c=50,a=100)

运行结果:
a is 3 b is b 7 c is 10
a is 25 b is b 5 c is 24
a is 100 b is b 5 c is 50

看,怎么样,是不是灵活了很多,方便了很多。

可变参数

有时想要定义的函数里面有任意数量的变量,也就是参数数量是可变的,这时可以使用*来实现。

def total(a=5,*numbers,**phonebook):
    print('a',a)

    #遍历元组中的所有项目
    for single_item in numbers:
        print('single_item',single_item)

    #遍历字典中的所有项目
    for first_part,second_part in phonebook.items():
        print(first_part,second_part)

print(total(10,1,2,3,jack=123,lucy=345,jim=567))

得出的结果:
a 10
single_item 1
single_item 2
single_item 3
jack 123
lucy 345
jim 567
None

它是如何工作的:
当你声明一个诸如*param的星号参数时,从此开始直到结束的所有位置参数(Position Arguments)都被收集到一个名为‘param’的元组(tuple)中。

当你声明一个诸如**param的双星号参数时,从此开始直至结束的所有关键词参数都将被收集到一个名为‘param’的字典(Dictionary)中。

return语句

retrun语句用于从函数中返回,也就是中断函数。我们也可以选择在中断函数时,从函数返回一个值。

def maximum(x,y):
    if x>y:
        return x
    elif x==y:
        return "The numbers are equal"
    else:
        return y

print(maximum(2,9))

运行结果:
9

要注意,return语句没有搭配任何一个值,则代表着返回NoneNone在python这种是一个特殊类型,表示虚无。
每一个函数在末尾都隐含了一句return None,除非你自己写了retrun语句,

def some_function():
    pass
print(some_function())

得出的结果就是:None
python中的pass用来指示一个没有内容的语句块。

DocStrings

python有个甚是优美的功能称作文档字符串(Docmentation Strings),它能让你更好记录程序,更加易于理解。当程序运行时,我们甚至可以通过一个函数来获取文档。

def print_max(x,y):
    '''打印两个数值中的最大数。

    这两个数都应该是整数。 '''

    x=int(x)
    y=int(y)
    if x>y:
        print(x,'is maximum')
    else:
        print(y,'is maximum')

print_max(3,5)

print(print_max.__doc__)

print(help(print_max))

运行结果:

5 is maximum
打印两个数值中的最大数。

    这两个数都应该是整数。 
Help on function print_max in module __main__:

print_max(x, y)
    打印两个数值中的最大数。

    这两个数都应该是整数。

None

DocStrings就类似一个帮助文档,把注释按照规定的格式写好后。以后方便自己检索,也方便别人查看。

该文档字符串所约定的是一串多行字符串,其中第一行以某一大写字母开始,以句号结束。 第二行为空行,后跟的第三行开始是任何详细的解释说明。

在此强烈建议你在你所有重要功 能的所有文档字符串中都遵循这一约定。

自动化工具可以以这种方式检索你的程序中的文档。因此,我强烈推荐你为你编写的所有重
要的函数配以文档字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值