python函数(一)

1、函数的定义:

def test():
print('test is running...')
return

定义一个函数,有3个部分需要注意:

  1. 函数名称。函数的命名规范与变量类似:不能以数字开头、不能包含非法字符、不能包含空格,以及不要使用python的保留字;
  2. 函数的参数。名称后的括号内是函数的参数,这种参数属于形式参数,也就是作为传递用的参数。参数包括位置参数和关键字参数。
  3. 函数的返回值。return语句一般写在函数的最后一句,执行到return时函数就会终止。每一个函数都有return语句,有些函数没有显式地写出返回值,python默认将None作为返回值返回。

2、函数的调用

使用“函数名+实参”的方式来调用函数。

def test1(x):
x = x + 1
print('test1 is running in x + 1')
return x i = test1(3)
print(i)

打印结果:

test1 is running in x + 1
4

上述例子中,形参就是x,test1的作用是将传入的x加1后返回。在调用函数时,3就是被传入的实参。函数运行后,将函数的返回值赋给i,并打印i。

python中可以声明同名函数,但是调用时会调用距离最近的那个函数。

def foo():
print('far foo()...') def foo():
print('near foo()...') foo()

打印结果:

near foo()...

3、函数的参数

在定义函数时,可以在函数名称后面的括号内指定函数的参数。python中函数的参数可以分为2类:位置参数和关键字参数。

位置参数

位置参数,在传入实参时按照参数的位置一一对应。这类参数不能重名(不能指定两个相同的位置参数)。

# 求 x 的 n 次方
def power(x, n):
sum = x
while n > 1:
sum *= x
n -= 1
return sum i = power(3, 5)
print('{0}的{1}次方是'.format(3, 5), i)

打印结果:

3的5次方是 243

上述例子中,3和5依次传给power(x, n)中的x和n。函数定义时指定了几个位置参数,就要传入几个位置参数,否则会报错。

关键字参数

关键字参数也叫默认参数,指定参数的参数的形式如下:key=value。这种指定形式类似于字典。在声明关键字参数时,不仅需要形参的名称,还要为该形参指定一个默认值。

def getAge(bornyear, name='Tom'):
import datetime as dt
age = dt.datetime.now().year - bornyear
print(name + '的年龄为' + str(age) + '岁') getAge(1993)
getAge(1922, 'Lord')

打印结果:

Tom的年龄为26岁
Lord的年龄为97岁

上述函数中,bornyear是一个位置参数,name就是一个关键字参数,指定的默认值为'Tom'。在调用该函数时,如果不显式地为name重新赋值,则函数就会按照默认值进行输出。

关键字参数可以按照默认位置顺序提供参数,如:getAge(1922, 'Lord');也可以使用name='Jerry'这种形式为参数赋值。使用后一种赋值形式时,关键字参数的位置可以随意调换。

def enroll(name='Jerry', score='F', major='math'):
print('姓名:' + name + ',主修:' + major + ',成绩:' + score) enroll(major='computer',score='A',name='Hagrid')

打印结果:

姓名:Hagrid,主修:computer,成绩:A

参数之间的关系

(1) 首先,位置参数必须在关键字参数前声明,赋值时,位置参数也必须先进行赋值。

(2) 其次,关键字参数在声明默认值时,默认值必须是不可变对象(如字符串、整型或元组)。因为在第一次调用函数时,默认参数所指向的变量会在内存中被创建出来。如果再次调用,它所指向的变量就会变成改变后的对象了,默认参数的内容就会改变。

def add_cake(L=[]):
L.append('cake')
return L print(add_cake())
print(add_cake())

打印结果:

['cake']
['cake', 'cake']

上述例子中,add_cake函数中的L默认指向了一个list(可变对象)。在第一次调用add_cake函数时,L变量就被创建出来,第二次调用就会指向已创建的L对象,调用append方法也就是在所创建的L后面添加元素。

(3) 可变参数的声明。当一个函数需要传入多个值时,可以声明一个形参,并在前面加上*,python就会把传入的多个值组成一个tuple。

def getSum(*num):
sum = 0
for i in num:
sum += i
return sum v = getSum(1, 3, 5, 7, 34)
print(v)

这种写法的好处是,当需要传入可遍历参数(如list或tuple)时,你可以直接传入单个值而不用把它们写成[]或()了。

这种方法也可以将已有的list或tuple中的所有元素当作可变参数传入。

对于关键字参数,可以在形参前加上**,表示把传入的参数组成一个dict.

def getInfo(name, age, **kwargs):
print(name, age, kwargs) # 只传入位置参数
getInfo('Harry', 18) # 可以传入任意数量的关键字参数
getInfo('Harry', 18, city='London', score='F')

打印结果:

Harry 18 {}
Harry 18 {'city': 'London', 'score': 'F'}

同样,也可以将已有的dict中的所有元素当成可变参数传入。

(4) 当一个函数使用(*args, **kw)来表示其参数时,表示该函数可以接收任意类型、任意数量的参数。

def getPerson(*args,**kwargs):
print(args, kwargs) getPerson('name is Tom', age=15, city='New York')

打印结果:

('name is Tom',) {'age': 15, 'city': 'New York'}

可以看到,*args即可变的位置参数,被组成了元组;**kwargs被组成了字典。

python函数(一)的更多相关文章

  1. python 函数之day3

    一 函数的语法及特性 什么是函数? 定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可. 特性: 减少重复代码 使程序变的可扩展 使程 ...

  2. Python函数作用域的查找顺序

    函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...

  3. Python函数讲解

    Python函数

  4. Python函数信息

    Python函数func的信息可以通过func.func_*和func.func_code来获取 一.先看看它们的应用吧: 1.获取原函数名称: 1 >>> def yes():pa ...

  5. Python函数参数默认值的陷阱和原理深究"

    本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  6. Python开发【第四章】:Python函数剖析

    一.Python函数剖析 1.函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def fun ...

  7. Python函数解析

    对于Python的函数,我们需要记住的是: 1. 函数的默认返回值是None. 2. python是一个自上而下逐行解释并执行的语言.因此,函数的定义必须在函数被调用之前.同名的函数,后定义的会覆盖前 ...

  8. Python入门笔记(18):Python函数(1):基础部分

    一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/archive/2011/08/29/2153871.html 一般程序设计语言包含两种基本的抽象:过 ...

  9. Python函数1

    Python 函数命令的使用 想想我们之前数学中学到的函数,首先我们需要定义一个函数,例如f(x)=x, 当x输入任意数的时候,f(x)都能输出和x相等的数值. 那么在Python中是如何实现的呢? ...

  10. python函数传参是传值还是传引用?

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

随机推荐

  1. Java 泛型的作用及其基本概念

    一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中 ...

  2. Unable to complete the scan for annotations for web application [/wrs] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies.

    tomcat启动报错:Jul 20, 2018 11:48:37 AM org.apache.catalina.core.ContainerBase addChildInternalSEVERE: C ...

  3. jmeter压测之添加负载机

    jmeter压测基本介绍一般基准测试(基准测试时间一般为5分钟)后压测的时间是10-15分钟: 实施测试之前要拿到测试指标 例如:tps要达到多少响应时间要达到多少并发数要达到多少TPS :服务端每秒 ...

  4. windows的cmd批处理命令及powershell (二)

    1.变量设置 for /l %%i in (1,1,100) do @echo %%i set /a i=500set /a i=%i%+200echo %i%pause ++++++++++++++ ...

  5. Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]

    今天在测试项目代码时,在idea中配置tomcat7插件运行后一直报如下错误: 解决方案:看了网上大多数办法都是修改xml文件配置,感觉并不适用,最后看到比较靠谱解释如下: pom.xml中jar包发 ...

  6. js 模拟css3 动画3

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. LeetCode OJ 102. Binary Tree Level Order Traversal

    题目 Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to rig ...

  8. 【ESP8266】、ESP8266通讯使用的AT指令

    一.AT指令介绍 AT(Attention), AT指令一般应用于终端设备和PC应用之间建立连接.通过AT指令来控制. 二.常用AT指令 AT指令主要分为: 基础AT指令,WIFI功能AT指令,TCP ...

  9. window.location.href 页面不跳转解决

    function login() { var userid = $("#username").val(); var userpwd = $("#pwd").va ...

  10. HTTPS SSL/TLS协议

    要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识.1. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义2. 大致了解 HTTP 和 TCP 的关系(尤其是“短连接”VS“长连接 ...