: | : | :期货量化学习 | :期货量化 |
返回列表 发帖

Python基础知识 -【函数:def 语句】

Python基础知识 -【函数:def 语句】

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

定义一个函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

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



语法

Python 定义函数使用 def 关键字,一般格式如下:
  1. def 函数名(参数列表):
  2.     函数体
复制代码
默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。

实例

让我们使用函数来输出"Hello World!":
  1. #!/usr/bin/python3

  2. def hello() :
  3.     print("Hello World!")

  4. hello()
复制代码
更复杂点的应用,函数中带上参数变量:

实例(Python 3.0+)

比较两个数,并返回较大的数:
  1. #!/usr/bin/python3

  2. def max(a, b):
  3.     if a > b:
  4.         return a
  5.     else:
  6.         return b

  7. a = 4
  8. b = 5
  9. print(max(a, b))
复制代码
以上实例输出结果:
  1. 5
复制代码
实例(Python 3.0+)

计算面积函数:
  1. #!/usr/bin/python3

  2. # 计算面积函数
  3. def area(width, height):
  4.     return width * height

  5. def print_welcome(name):
  6.     print("Welcome", name)

  7. print_welcome("Runoob")
  8. w = 4
  9. h = 5
  10. print("width =", w, " height =", h, " area =", area(w, h))
复制代码
以上实例输出结果:
  1. Welcome Runoob
  2. width = 4  height = 5  area = 20
复制代码
函数调用

定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。

如下实例调用了 printme() 函数:

实例(Python 3.0+)
  1. #!/usr/bin/python3

  2. # 定义函数
  3. def printme( str ):
  4.    # 打印任何传入的字符串
  5.    print (str)
  6.    return

  7. # 调用函数
  8. printme("我要调用用户自定义函数!")
  9. printme("再次调用同一函数")
复制代码
以上实例输出结果:
  1. 我要调用用户自定义函数!

  2. 再次调用同一函数
复制代码
参数传递

在 python 中,类型属于对象,对象有不同类型的区分,变量是没有类型的:
  1. a=[1,2,3]

  2. a="Runoob"
复制代码
以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。

可更改(mutable)与不可更改(immutable)对象

在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。

    不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。

    可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

python 函数的参数传递:

    不可变类型:类似 C++ 的值传递,如整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值,则是新生成一个 a 的对象。

    可变类型:类似 C++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响

python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

python 传不可变对象实例

通过 id() 函数来查看内存地址变化:

实例(Python 3.0+)
  1. def change(a):
  2.     print(id(a))   # 指向的是同一个对象
  3.     a=10
  4.     print(id(a))   # 一个新对象

  5. a=1
  6. print(id(a))
  7. change(a)
复制代码
以上实例输出结果为:
  1. 4379369136
  2. 4379369136
  3. 4379369424
复制代码
可以看见在调用函数前后,形参和实参指向的是同一个对象(对象 id 相同),在函数内部修改形参后,形参指向的是不同的 id。

传可变对象实例

可变对象在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。例如:

实例(Python 3.0+)
  1. #!/usr/bin/python3

  2. # 可写函数说明
  3. def changeme( mylist ):
  4.    "修改传入的列表"
  5.    mylist.append([1,2,3,4])
  6.    print ("函数内取值: ", mylist)
  7.    return

  8. # 调用changeme函数
  9. mylist = [10,20,30]
  10. changeme( mylist )
  11. print ("函数外取值: ", mylist)
复制代码
传入函数的和在末尾添加新内容的对象用的是同一个引用。故输出结果如下:
  1. 函数内取值:  [10, 20, 30, [1, 2, 3, 4]]
  2. 函数外取值:  [10, 20, 30, [1, 2, 3, 4]]
复制代码
参数

以下是调用函数时可使用的正式参数类型:

    必需参数
    关键字参数
    默认参数
    不定长参数

必需参数

必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

调用 printme() 函数,你必须传入一个参数,不然会出现语法错误:

实例(Python 3.0+)
  1. #!/usr/bin/python3

  2. #可写函数说明
  3. def printme( str ):
  4.    "打印任何传入的字符串"
  5.    print (str)
  6.    return

  7. # 调用 printme 函数,不加参数会报错
  8. printme()
复制代码
以上实例输出结果:
  1. Traceback (most recent call last):
  2.   File "test.py", line 10, in <module>
  3.     printme()
  4. TypeError: printme() missing 1 required positional argument: 'str'
复制代码
关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

以下实例在函数 printme() 调用时使用参数名:

实例(Python 3.0+)
  1. #!/usr/bin/python3

  2. #可写函数说明
  3. def printme( str ):
  4.    "打印任何传入的字符串"
  5.    print (str)
  6.    return

  7. #调用printme函数
  8. printme( str = "菜鸟教程")
复制代码
以上实例输出结果:
  1. 菜鸟教程
复制代码
以下实例中演示了函数参数的使用不需要使用指定顺序:

实例(Python 3.0+)
  1. #!/usr/bin/python3

  2. #可写函数说明
  3. def printinfo( name, age ):
  4.    "打印任何传入的字符串"
  5.    print ("名字: ", name)
  6.    print ("年龄: ", age)
  7.    return

  8. #调用printinfo函数
  9. printinfo( age=50, name="runoob" )
复制代码
以上实例输出结果:
  1. 名字:  runoob
  2. 年龄:  50
复制代码
默认参数

调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:

实例(Python 3.0+)
  1. #!/usr/bin/python3

  2. #可写函数说明
  3. def printinfo( name, age = 35 ):
  4.    "打印任何传入的字符串"
  5.    print ("名字: ", name)
  6.    print ("年龄: ", age)
  7.    return

  8. #调用printinfo函数
  9. printinfo( age=50, name="runoob" )
  10. print ("------------------------")
  11. printinfo( name="runoob" )
复制代码
以上实例输出结果:
  1. 名字:  runoob
  2. 年龄:  50
  3. ------------------------
  4. 名字:  runoob
  5. 年龄:  35
复制代码
不定长参数

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。基本语法如下:
  1. def functionname([formal_args,] *var_args_tuple ):
  2.    "函数_文档字符串"
  3.    function_suite
  4.    return [expression]
复制代码
加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。

实例(Python 3.0+)
  1. #!/usr/bin/python3
  2.   
  3. # 可写函数说明
  4. def printinfo( arg1, *vartuple ):
  5.    "打印任何传入的参数"
  6.    print ("输出: ")
  7.    print (arg1)
  8.    print (vartuple)

  9. # 调用printinfo 函数
  10. printinfo( 70, 60, 50 )
复制代码
以上实例输出结果:
  1. 输出:
  2. 70
  3. (60, 50)
复制代码
如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。如下实例:

实例(Python 3.0+)
  1. #!/usr/bin/python3

  2. # 可写函数说明
  3. def printinfo( arg1, *vartuple ):
  4.    "打印任何传入的参数"
  5.    print ("输出: ")
  6.    print (arg1)
  7.    for var in vartuple:
  8.       print (var)
  9.    return

  10. # 调用printinfo 函数
  11. printinfo( 10 )
  12. printinfo( 70, 60, 50 )
复制代码
以上实例输出结果:
  1. 输出:
  2. 10
  3. 输出:
  4. 70
  5. 60
  6. 50
复制代码
还有一种就是参数带两个星号 **基本语法如下:
  1. def functionname([formal_args,] **var_args_dict ):
  2.    "函数_文档字符串"
  3.    function_suite
  4.    return [expression]
复制代码
加了两个星号 ** 的参数会以字典的形式导入。

实例(Python 3.0+)
  1. #!/usr/bin/python3
  2.   
  3. # 可写函数说明
  4. def printinfo( arg1, **vardict ):
  5.    "打印任何传入的参数"
  6.    print ("输出: ")
  7.    print (arg1)
  8.    print (vardict)

  9. # 调用printinfo 函数
  10. printinfo(1, a=2,b=3)
复制代码
以上实例输出结果:
  1. 输出:
  2. 1
  3. {'a': 2, 'b': 3}
复制代码
声明函数时,参数中星号 * 可以单独出现,例如:
  1. def f(a,b,*,c):
  2.     return a+b+c
复制代码
如果单独出现星号 *,则星号 * 后的参数必须用关键字传入:
  1. >>> def f(a,b,*,c):
  2. ...     return a+b+c
  3. ...
  4. >>> f(1,2,3)   # 报错
  5. Traceback (most recent call last):
  6.   File "<stdin>", line 1, in <module>
  7. TypeError: f() takes 2 positional arguments but 3 were given
  8. >>> f(1,2,c=3) # 正常
  9. 6
  10. >>>
复制代码

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易
  2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
  3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
  4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

返回列表