一、函数定义与调用

def 函数名([参数列表]):
'''注释'''
函数体
# 输出小于n的斐波那契数
>>def fib(n):
a,b=1,1
while a < n:
print(a,end=' ')
a,b=b,a+b
print() >>fib(3)
1 1 2

二、形参与实参

在绝大多数情况下,在函数内部直接修改形参的值不会影响实参

def addOne(a):
print(a)
a+=1
print(a) >>a=3
>>addOne(a)
3
4 >>a
3

修改函数参数值的方式:

如果传递给函数的是可变序列,

并且在函数内部使用下标或其他方式为课表序列增加、删除、修改元素值时,

修改后的结果可以反映到函数之外,即实参得到相应修改

# 修改列表元素的值
def modify(v):
v[0] = v[0] + 1 >>a=[2]
>>print(a)
[2]
>>modify(a)
>>print(a)
[3]
# 为列表增加元素
def addList(v,item):
v.append(item) >>a=[2]
>>addList(a,3)
>>print(a)
[2,3]

三、参数类型

python函数参数主要分为:普通参数、默认值参数、关键参数、可变长度参数等

在定义函数时不需要指定参数的类型,形参类型由实参类型以及python解释器的理解和推断决定

同样,不需要指定函数的返回值类型,由return语句返回值的类型决定

缺少return语句或没有执行return语句时,默认返回空值None

1. 默认值参数

调用带有默认值的函数时,可以不对默认值参数赋值,也可以通过显示赋值来替换其默认值

在定义带有默认值的函数时,默认值参数必须出现在函数形参列表的最右端,且任何一个默认值参数右边都不能再出现非默认值参数

def 函数名(..., 形参名=默认值 ):
函数体 def say(message, time=1):
print((message+' ')*times) >>say.__defaults__
(1,)

2.关键参数

指调用函数时的参数传递方式,而与函数定义无关

通过关键参数可以按名字传递值,实参顺序可以和形参不一致

def demo(a,b,c=5):
print(a,b,c) >>demo(3,7)
3 7 5 >>demo(c=8,a=9,b=0)
9 0 8

3.可变长度参数

*parameter 用来接收任意多个实参并将其放在一个元组中

**parameter 用来接收类似于关键参数一样显示赋值形式的多个实参并将其放入字典中

def demo(*P):
print(P) # 将实参放入元组
>>demo(1,2,3)
(1,2,3) # 在调用函数时,自动将接收参数转换为字典
def demo(**p):
for item in p.items():
print(item) >>demo(x=1,y=2,z=3)
('x', 1)
('y', 2)
('z', 3)

4.参数传递时的序列解包

可以使用列表、元组、集合、字典及其他可迭代对象作为实参,

并在实参名称前加一个星号,解释器自动进行解包,并传递给多个单变量形参

要保证实参中元素个数与形参个数相等

def demo(a,b,c):
print(a+b+c) >>seq = [1,2,3]
>>demo(*seq)
6 # 字典型,默认按照键解包
>>dic={1:'a',2:'b',3:'c'}
>>demo(*dic)
6 # 指定按照值解包
>>demo(*dic.values())
abc

四、变量作用域

函数内部定义的变量一般为局部变量,不属于任何函数的变量一般为全局变量

应尽量避免使用全局变量,引用速度慢,增加不同函数之间的隐式耦合度

如果想在函数内部修改一个定义在函数外的变量值,那么这个变量就不能是局部的

def demo():
global x # 声明全局变量
x=3 # 修改全局变量的值
y=4 # 局部变量
print(x,y) x=5 # 在函数外定义全局变量
demo() # 调用函数,修改全局变量的值
print(x)
out: 5 print(y) # 函数结束后,局部变量自动删除
out: NameError: name 'y' is not defined del x # 删除全局变量

不同模块间共享全局变量,定义单独的模块,传递全局变量

# 定义模块 A.py
global_var = 0 # 在模块 B.py中
import A
A.global_var = 1 # 在模块C.py中
import A
A.global_var = 2

 函数实例:

1、编写函数,接收字符串参数,返回一个元组,其中第一个元素为大写字母个数,第二个为小写字母个数

def countStr(s):
result = [0,0]
for ch in s:
if 'a'<= ch <= 'z':
result[1] += 1
elif 'A' <= ch <= 'Z':
result[0] += 1
return result tmpStr = 'abANV'
bigN,littleN = countStr(tmpStr)
print(bigN,littleN) out:
3 2

2、编写函数,接收一个所有元素值互不相等的整数列表x和一个整数n,要求将值为n的元素作为支点,

将列表中所有小于n的元素全部放在n的前面,所有值大于n的元素放在n后面

 import random
def sortN(x,n):
if n not in x:
print(n,' is not an element of ',x)
return i = x.index(n) # 获取指定元素在列表中的索引
x[0],x[i] = x[i],x[0] # 与第0个元素交换
key = x[0] i = 0
j = len(x)-1
while i<j:
while i < j and x[j] >= key:
j-=1
x[i]=x[j] # 从后向前找第一个比指定元素小的元素 while i < j and x[i] <= key:
i+=1
x[j]=x[i] # 从前向后找第一个比指定元素小的元素 x[i] = key return x
 x=list(range(1,10))
random.shuffle(x)
print(x)
sortN(x,4)
print(x)

python程序设计——函数设计与调用的更多相关文章

  1. python中函数的定义,调用,全局变量,局部变量,函数的嵌套使用-初级篇

    函数的基本概述 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,可以思考一下如果有某个功能的代码是在多个地方使用的是否可以只写一次?此时的代码该如何定义.先观察以下的案例: ...

  2. [C++程序设计]函数的递归调用

    在调用一个函数的过程中又出现直接或间接地调用 该函数本身,称为函数的递归(recursive)调用. 包含递归调用的函数称为递归函数. 在实现递归时,在时间和空间上的开销比较大 求n! #includ ...

  3. python中函数定义与调用顺序问题

    def main(): try: mtd(3) except Exception as e: print("程序出现异常:", e) mtd(3) def mtd(a): if a ...

  4. python学习:函数的递归调用

    计算阶层   普通方法: -使用循环   #!/usr/bin/python   def factorial(n):     sum = 1     for i in range(1,n+1):   ...

  5. [Python学习笔记][第五章Python函数设计与使用]

    2016/1/29学习内容 第四章 Python函数设计与使用 之前的几页忘记保存了 很伤心 变量作用域 -一个变量已在函数外定义,如果在函数内需要修改这个变量的值,并将这个赋值结果反映到函数之外,可 ...

  6. Python:学会创建并调用函数

    这是关于Python的第4篇文章,主要介绍下如何创建并调用函数. print():是打印放入对象的函数 len():是返回对象长度的函数 input():是让用户输入对象的函数 ... 简单来说,函数 ...

  7. Python中将函数作为另一个函数的参数传入并调用

    在Python中,函数本身也是对象,所以可以将函数作为参数传入另一函数并进行调用 在旧版本中,可以使用apply(function, *args, **kwargs)进行调用,但是在新版本中已经移除, ...

  8. Python基础(函数,函数的定义,函数的调用,函数的参数,递归函数)

    1.函数 我们知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = ...

  9. Python面向对象 -- slots, @property、多重继承MixIn、定制类(str, iter, getitem, getattr, call, callable函数,可调用对象)、元类(type, metaclass)

    面向对象设计中最基础的3个概念:数据封装.继承和多态 动态给class增加功能 正常情况下,当定义了一个class,然后创建了一个class的实例后,可以在程序运行的过程中给该实例绑定任何属性和方法, ...

随机推荐

  1. ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy)

    ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy) 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了, ...

  2. 在WinCE上播放声音、设置透明图片、系统音量 C#

    记录一下用到的C#在WinCE平台上的相关技巧备查 1.C#在WinCE上实现透明图片 1 2 3 4 5 6 7 8 9 using System.Drawing.Imaging;       pu ...

  3. js获取浏览器上一访问页面URL地址,document.referrer方法

    如题,可用document.referrer方法获取上一页面的url 但是也有不可使用的情况 直接在浏览器地址栏中输入地址: 使用location.reload()刷新(location.href或者 ...

  4. String的非空判断、Integer的非空判断、list的大小判断,对象的非空判断

    1.String的非空判断. StringUtils.isNotEmpty(String str); 2.Integer的非空判断. null != Integer ; 3.list的大小判断. li ...

  5. Oracle GoldenGate同步服务归档空间维护

    ORA-00257: archiver error. Connect internal only, until freed 查看归档日志序列 SQL> archive log list; Aut ...

  6. 原生 JS 实现扫雷 (分析+代码实现)

    阅读这篇文章需要掌握的基础知识:Html5.CSS.JavaScript 在线Demo:查看 扫雷规则 在写扫雷之前,我们先了解下它的游戏规则 ● 扫雷是一个矩阵,地雷随机分布在方格上. ● 方格上的 ...

  7. mybatis使用*号查询数据丢失问题

    使用*号的SQL语句:select * from 表名 在开发过程中可能你会发现使用mybatis框架爱作为持久层时,写的SQL语句在工具里面查询数据是可以查到想要的数据的,但是在项目中会出现数据丢失 ...

  8. Python字符串必记函数

    Python字符串函数数不胜数,想要记完所有几乎不可能,下列几个是极为重要的一些函数,属于必记函数. 一.join 功能: 将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串 语 ...

  9. day31 进程和其他方法,锁,队列

    1.进程的其他方法: 首先引入模块: import os from multiprocessing import Process p = Process(target=f,) 进程的id:  p.pi ...

  10. flask的查询,一对多,多对多

    模型的关联: 一对多 class Role(db.Model): us = db.relationship('User',backref='role',lazy='dynamic') class Us ...