Python自学之路——Python基础(三)函数初识

  • 函数

之前学的编程都是从上到下一步一步面向过程的编程,这样做的后果就是很多类似的代码不断地复制粘贴,显得很没有技术含量。现在,终于可以开始接触函数了,开始要进行函数式编程了,想想还是很激动的~~~~~~好了,废话不说,函数到底是怎么样的呢?

一、函数定义的基本形式:

def function(params):
    block
    return expression/value

形式很简单,但这里有几点要注意:

  1. 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
  2. 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数,参数可以没有,一个或者多个。
  3. 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  4. 函数内容以冒号起始,并且缩进。
  5. return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。return语句不是必须的。

           此时,返回的是None

函数的最大特点是提高了代码的重用性和可读性,那么该怎么调用函数呢?

二、函数的使用

在定义了函数之后,就可以使用该函数了,但是在Python中要注意一个问题,就是在Python中不允许前向引用,即在函数定义之前,不允许调用该函数。

在函数的使用过程中,有几点需要我们特别注意:

函数的参数

参数有分形参和实参。形参的全称是形式参数,是用def关键字定义函数时函数名后括号内的变量,实参的全称是实际参数,是指调用函数时提供的值或者变量。举例如下:

def add(a,b)     #a,b为形参
    return a+b

add(1,2)          #1,2为实参

x=2
y=3
add(x,y)          #x,y为实参

参数的分类

详见:http://www.cnblogs.com/dolphin0520/archive/2013/03/15/2959602.html(该文章有些出入,谨看慎思。python中,所有的变量、值都是按引用传递的)

          http://www.cnblogs.com/wupeiqi/articles/5453708.html

函数补充1:程序执行是从上往下一步步执行的,如下图,定义了两个f1函数,第一个f1由于第二个f1的存在,在执行的过程中会被废弃,python中有垃圾回收机制清除。

    

函数补充2:编程中一个绕不过去的问题是变量是按值传递还是按引用传递,不理解这一点会使自己在看别人程序或者自己写代码时云里雾里,现在,就让我们一起看下这两点到底有什么区别。如下 ,左图是按值传递对一个函数的调用过程,若是这个原理的话,那么输出的结果将还是[11, 22, 33, 44].........右图是按引用传递,此时,lis 和 a1指向的是同一个内存地址,那么,输出的结果将是[11, 22, 33, 44, 999].分析了那么多,真正的结果是什么呢?哈哈,看下面的运行结果吧……

"C:\Program Files\Python35\python3.exe" C:/Users/linlinda/PycharmProjects/fighting/test/set.py
[11, 22, 33, 44, 999]
Process finished with exit code 0

    按值传递        按引用传递

 

函数补充3:全局变量和局部变量

所谓全局变量,是在所有作用域都可读。在函数里面定义的一个变量是局部变量,局部变量的改变并不会改变全局变量的值,如果想要在函数里改变全局变量的值,需要在变量前加global。但有特例需要注意,如果全局变量是列表或者字典这种复杂类型时,函数里可对全局变量进行修改,但是不可重新赋值,因为重新赋值在全局中并不生效。还有,定义全局变量的时候要全部都是大写,利人利已(原谅我下面代码中没有使用,不要学我……)

 1 name = 'alex'
 2 def f1():
 3     age = 18
 4     name = 'jack'
 5     print(age, name)
 6 
 7 
 8 def f2():
 9     age = 19
10     print(age, name)
11 
12 f1()
13 f2()
14 输出结果:
15 name = 'alex'
16 def f1():
17     age = 18
18     name = 'jack'
19     print(age, name)
20 
21 
22 def f2():
23     age = 19
24     print(age, name)
25 
26 f1()
27 f2()
View Code
 1 name = 'alex'
 2 def f1():
 3     age = 18
 4     global name    #name表示全局变量
 5     name = 'jack'
 6     print(age, name)
 7 
 8 
 9 def f2():
10     age = 19
11     print(age, name)
12 
13 f1()
14 f2()
15 输出结果:
16 18 jack
17 19 jack
View Code
 1 name = ['alex', 'jack', 'eric']
 2 def f1():
 3     age = 18
 4     name[0] = 'davie'
 5     print(age, name)
 6 
 7 
 8 def f2():
 9     age = 19
10     print(age, name)
11 
12 f1()
13 f2()
14 输出结果:
15 18 ['davie', 'jack', 'eric']
16 19 ['davie', 'jack', 'eric']
View Code

 

转载于:https://www.cnblogs.com/mumuzi1990/p/5800279.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值