函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,能提高应用的模块性,和代码的重复利用率

Python提供了许多内建函数,比如print()。也可以自己创建函数,这被叫做用户自定义函数。

定义一个函数

函数代码以def开头,后接着函数名和圆括号()

传入的参数和自变量必须放在圆括号中间,圆括号中可以定义参数

函数的第一行语句可以使用字符串来当做函数的文字说明

函数的内容以冒号开始,并且缩进

return【表达式】结果函数,并返回一个值给调用方,如果没有加return,默认返回None

实例

def my_abs(x):
'求绝对值'
if x >= 0:
return x
else:
return -x

函数调用

在调用函数的时候,需要知道函数的名称和参数

print(my_abs(-3))

Python内置了很多有用的函数,我们可以直接调用,比如求绝对值的函数abs,只有一个参数

print(abs(-1))

函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”:

a = abs  #变量a指向abs函数
print(a(-2)) #通过a调用abs函数

在调用函数的时候,如果传入的参数数量不正确,会报TypeError的错误,并会给出提示。abs只能给一个参数,但给了两个

print(abs(-1,-2))

如果给的参数类型不对,也会报TypeError的错误,并且给出错误信息:str是错误的参数类型

print(abs('ss'))

参数检查

调用函数时,如果参数个数不对,python解释器会自动检测出来,并抛出TypeError.

但是如果参数类型错误了,Python的解释器就无法帮忙检测出来

my_abs('')

使用自己定义的my_abs传入不恰当的参数时,导致if语句出错,所以出错的信息提示和内置的abs提示不一致

数据类型检查可以用内置函数isinstance()实现:

def my_abs(x):
if not isinstance(x,(int,float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
my_abs('')

返回多个值

函数可以返回多个值   计算平方根可以调用math.sqrt()函数

定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax2 + bx + c = 0的两个解

import math
def quadratic(a,b,c):
d = b**2-4*a*c
if d < 0 :
return print("次方程无解")
x1 = (-b+math.sqrt(d))/(2*a)
x2 = (-b-math.sqrt(d))/(2*a)
return x1,x2
a,b = quadratic(2, 3, 1)
print(a,b)

看着是返回了两个值a和b,但是其实Python函数返回的仍然是单一值

r = quadratic(2, 3, 1)
print(r)

返回值是一个tuple!但是在语法上返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,

按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。

参数传递

在Python中,类型属于对象,变量是没有类型的

a = [1,2,3]

a = "Runoob"

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

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

在Python中,string,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 函数的参数传递:

'''不可变类型:当传递的参数是整数、字符串、元祖等不可变对象时候,如fun(a)传递的只是a的值,并没有影响a对象本身,比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身

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

python 传不可变对象实例

def ChangeInt(a):
a = 10
b = 2
ChangeInt(b)
print(b)


实例中有 int 对象 2,指向它的变量是 b,在传递给 ChangeInt 函数时,按传值的方式复制了变量 b,a 和 b 都指向了同一个 Int 对象,在 a=10 时,则新生成一个 int 值对象 10,并让 a 指向它

传可变对象实例

def Changeme(mylist):
mylist.append([1,2,3,4])
print("函数内取值: ",mylist)
return
c = [10,20,30]
Changeme(c)
print("函数外取值: ", c)


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

Python3学习笔记12-定义函数及调用的更多相关文章

  1. php学习笔记:自定义函数的调用

    PHP内置了超过1000个函数,因此函数使得PHP成为一门非常强大的语言.大多数时候我们使用系统的内置函数就可以满足需求,但是自定义函数通过将一组代码封装起来,使代码进行复用,程序结构与逻辑更加清晰. ...

  2. python3学习笔记12(变量作用域)

    变量作用域 参考http://www.runoob.com/python3/python3-function.html Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量 ...

  3. python学习笔记12(函数三): 参数类型、递归、lambda函数

    一.函数参数的类型 之前我们接触到的那种函数参数定义和传递方式叫做位置参数,即参数是通过位置进行匹配的,从左到右,依次进行匹配,这个对参数的位置和个数都有严格的要求.而在Python中还有一种是通过参 ...

  4. python学习笔记5-自定义函数

    1 自定义函数  (1)函数代码块以def关键字开头,然后函数标识符名称和圆括号  (2)任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数  (3)函数的第一行语句可以选择性的使用文 ...

  5. javascript学习笔记(二):定义函数、调用函数、参数、返回值、局部和全局变量

    定义函数.调用函数.参数.返回值 关键字function定义函数,格式如下: function 函数名(){ 函数体 } 调用函数.参数.返回值的规则和c语言规则类似. <!DOCTYPE ht ...

  6. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  7. Python3+Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)'''from ...

  8. Python学习笔记之常用函数及说明

    Python学习笔记之常用函数及说明 俗话说"好记性不如烂笔头",老祖宗们几千年总结出来的东西还是有些道理的,所以,常用的东西也要记下来,不记不知道,一记吓一跳,乖乖,函数咋这么多 ...

  9. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

随机推荐

  1. 通过 powershell 配置 IIS

    1. 设置iis pool: cls Import-Module WebAdministration Get-ChildItem IIS:\apppools | ForEach-Object{     ...

  2. 结构体练习(C)

    结构体存储学生学号.姓名.总分,动态内存分配增加信息,然后排序 # include <stdio.h> # include <malloc.h> //# include < ...

  3. django MTV架构下的网站开发步骤

    1.需求分析必不可少,一定要具体列出本次网站项目所要实现的目标,可能包括简单的页面草图与功能方块图等. 2.数据库设计. 3.了解网站的每一个页面,并设计网页模板(.html)文件 4.使用virtu ...

  4. 13 款高逼格且实用的 Linux 运维必备工具

    转载于民工哥技术之路 1. 查看进程占用带宽情况 - Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽. 下载:http://sourceforge.ne ...

  5. Service Fabric基本概念: Node, Application, Service, Partition/Replicas

    作者:张鼎松 (Dingsong Zhang) @ Microsoft 在上一节中,为大家简明扼要的介绍了微软针对现代分布式系统在Azure上实现的相关服务组件.紧接上文内容,本节将为大家介绍Azur ...

  6. Java基础-考察JVM内部结构的常用工具介绍

    Java基础-考察JVM内部结构的常用工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们可以通过jvisualvm.exe考察jvm内部结构.而jvisualvm.exe ...

  7. Linux操作系统原理

    Linux操作系统原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.计算机经历的四个时代 1.第一代: 真空管计算机,输入和输出:穿孔卡片,对计算机操作起来非常不便,做一件事 ...

  8. 远程客户端连接MysqL数据库太慢解决方案

    远程客户端连接MysqL数据库太慢解决方案局域网客户端访问mysql 连接慢问题解决. cd /etc/mysql vi my.conf [mysqld] skip-name-resolve 此选项禁 ...

  9. js格式化日期工具类

    就是一个工具类  开箱即用 传进一个指定的参数,格式化 //将时间戳格式化 function getMyDate(time){ if(typeof(time)=="undefined&quo ...

  10. logback异步输出日志(生产者消费者模型),并非批量写入日志。

    一直对logback异步输出日志误解为异步批量写入日志. 今天看了源代码. 首先logback的异步日志是如何配置的: <!-- 管理端用户行为日志异步输出,异步的log片段必须在同步段后面,否 ...