python之函数

函数

自定义len()函数以及说明文档

自定义len()函数

#自定义len()函数
def my_len(str):
    length = 0
    for i in str:
        length += 1
    return length
#调用自定义的my_len()函数
a = my_len('i am a student')
print(a)
#14
b = my_len('i')
print(b)
#1

为定义函数写说明文档使用help()函数

#定义一个比较字符串大小的函数
def str_max(str1,str2):
    '''
    比较两个字符串的大小
    '''
    str = str1 if str1 >str2 else str2
    return str
help(str_max)```

## 函数的定义与调用
1.定义:==def 函数名 ():==     
 

> def 函数名 (参数列表)>...[return[返回值]] (可省略)

```python
#定义个空函数,没有实际意义
def padd_dis():
    pass

#定义一个比较字符串大小的函数
def str_max(str1,str2):
    str = str1 if str1 > str2 else str2
    return str
    #return str1 if str1 > str2 else str2

2.调用:函数名()

函数名();
[返回值] = 函数名([形参值])

############定义函数  def 函数名();############
def hospitalization():
    print('医生开具住院单通知')
    print('患者领取住院通知单')
    print('住院部办理入院登记')
    print('各类医保办理的流程')
    print('护士接诊并安排床位')
############调用函数函数  函数名();############
print('门诊接诊')
hospitalization()
print('住院治疗')

函数参数的定义与调用

1.参数函数定义: def 函数名 (para 1,para2):

def hospitalization(doctor,patient,insurance,department):
print(doctor + “医生开具住院单通知”)

############函数参数定义  def func(para1,para2);############
def hospitalization(doctor,patient,insurance,department):
    print(doctor + "医生开具住院通知单")
    print(patient + "患者领取住院通知单")
    print("住院部办理入院登记")
    print(insurance + "各类医保办理的流程")
    print(department + "护士接诊并安排床位")
############调用函数参数#########################
print("门诊接诊")
hospitalization("王秀", "张三", "职工医保", "血液科")
print("住院治疗")

缺省值参数与指定参数调用

缺省值参数:
def 函数名 (para 1 ,para 2 = “”,pare 3 = “”):
a. 函数参数的定义,一旦有缺省值后,后面所有的参数必须都有缺省值(如para含有缺省值,即已设置默认值,则后所有参数也必须含有缺省值)
b.调用时:函数名(“张三”)(调用时,如果参数与缺省值相同,直接可以不写,如果不同直接赋值即可,会自动覆盖掉缺省值)
指定参数调用

函数名(“张三”)
函数名(“张三”,”李四”)
函数名(part2 = “李四”,part 1 = “张三”,)
函数名(“张三”,part2 = “李四”)

调用时一旦某个函数指定了参数名, 后面的所有参数必须指定 参数名(即和缺省值同,para2)

#########缺省值函数参数的定义与调用#############
def hospitalization(doctor,patient,insurance = "职工医保",department = '无'):
    print(doctor + "医生开具住院通知单")
    print(patient + "患者领取住院通知单")
    print("住院部办理入院登记")
    print(insurance + "各类医保办理的流程")
    print(department + "护士接诊并安排床位")

print("门诊接诊")
####################缺省值参数调用#######
#hospitalization("王秀", "张三")# 参数与缺省值相同,则不用设置,不同可直接赋值进行覆盖
#hospitalization('王秀','张三','城乡医保')
####################指定值参数调用##########
#hospitalization('王秀','张三')
#hospitalization("王秀","张三","职工医保","血液科")
#hospitalization(patient = "王秀",doctor = "张三",department = "血液科",insurance = "职工医保")
hospitalization("王秀","张三",department = "血液科",insurance = "职工医保")
print("住院治疗")

关键字参数及用法

关键字参数:使用形参的名字来确定输入的参数值。通过此方式指定函数实参时,不再需要与形参的位置完全一致,只要将参数名字写正确即可。
位置参数必须放在关键字参数之前

def dis_str(str1,str2):
    print('str1:',str1)
    print('str2:',str2)
#位置参数
dis_str('a','b')
dis_str('a', str2='b')
dis_str(str2='a', str1='b')

参数的值传递

函数中操作的并不是实际的实参变量

a= 6
b = 9
swap(a,b)
print("交换后,a=",a,"b = ",b)
# swap函数里,a= 9 b =  6
# 交换后,a= 6 b =  9

参数的引用传递

def swap(dw):
    # 下面代码实现dw的a、b两个元素的值交换
    dw['a'], dw['b'] = dw['b'], dw['a']
    print("swap函数里,a元素的值是",\
        dw['a'], ";b元素的值是", dw['b'])
dw = {'a': 6, 'b': 9}
swap(dw)
print("交换结束后,a元素的值是",\
    dw['a'], ";b元素的值是", dw['b'])
# swap函数里,a元素的值是 9 ;b元素的值是 6
# 交换结束后,a元素的值是 9 ;b元素的值是 6

不改变参数就用值传递,改变某些数据就将数据包装秤列表、字典等可变对象,引用传递,在函数中通过列表字典的方法修改他们

全局变量和局部变量

全局变量两种方法
1.在函数体外定义的变量
2.在函数体内定义全局变量是使用global关键字对变量进行修饰后,变量会变成全局变量
获取指定作用域范围中的变量
1

globals()函数
返回一个包含全局范围内所有变量的字典,该字典中的每个键值对,键为变量名,值为该变量的值
可以对其进行修改

#全局变量
Pyname = "Python教程"
Pyadd = "http://c.biancheng.net/python/"
def text():
    #局部变量
    Shename = "shell教程"
    Sheadd= "http://c.biancheng.net/shell/"
print(globals())
#{ ...... , 'Pyname': 'Python教程', 'Pyadd': 'http://c.biancheng.net/python/', ......}
print(globals()['Pyname'])
globals()['Pyname'] = "Python入门教程"
print(Pyname)
#Python教程
#Python入门教程

2

locals()函数
包含当前作用域内所有变量的字典。这里所谓的“当前作用域”指的是,在函数内部调用 locals() 函数,会获得包含所有局部变量的字典;而在全局范文内调用 locals() 函数,其功能和 globals() 函数相同。
可以访问,但是无法进行相应的修改

#全局变量
Pyname = "Python教程"
Pyadd = "http://c.biancheng.net/python/"
def text():
    #局部变量
    Shename = "shell教程"
    Sheadd= "http://c.biancheng.net/shell/"
    print("函数内部的 locals:")
    print(locals())
text()
print("函数外部的 locals:")
print(locals())
#函数内部的 locals:
#{'Sheadd': 'http://c.biancheng.net/shell/', 'Shename': #'shell教程'}
#函数外部的 locals:
#{...... , 'Pyname': 'Python教程', 'Pyadd': #'http://c.biancheng.net/python/', ...... }

3

vars(object)功能是返回一个指定 object 对象范围内所有变量组成的字典。如果不传入object 参数,vars() 和 locals() 的作用完全相同。(涉及到类的知识)

#全局变量
Pyname = "Python教程"
Pyadd = "http://c.biancheng.net/python/"
class Demo:
    name = "Python 教程"
    add = "http://c.biancheng.net/python/"
print("有 object:")
print(vars(Demo))
print("无 object:")
print(vars())
#有 object:
#{...... , 'name': 'Python 教程', 'add': #'http://c.biancheng.net/python/', ......}
#无 object:
#{...... , 'Pyname': 'Python教程', 'Pyadd': 'http://c.biancheng.net/python/', ...... }

局部函数

函数内部定义函数

#全局函数
def outdef ():
    #局部函数
    def indef():
        print("http://c.biancheng.net/python/")
    #调用局部函数
    indef()
#调用全局函数
outdef()
#http://c.biancheng.net/python/

就如同全局函数返回其局部变量,就可以扩大该变量的作用域一样,通过将局部函数作为所在函数的返回值,也可以扩大局部函数的使用范围。例如,修改上面程序为:

#全局函数
def outdef ():
    #局部函数
    def indef():
        print("调用局部函数")
    #调用局部函数
    return indef
#调用全局函数
new_indef = outdef()
调用全局函数中的局部函数
new_indef()
#调用局部函数

如果 outdef() 不将 indef 作为返回值,则 indef() 只能在 outdef() 函数内部使用;反之,则 indef() 函数既可以在 outdef() 函数内部使用,也可以在 outdef() 函数的作用域,也就是全局范围内使用。

如果局部函数中定义有和所在函数中变量同名的变量,也会发生“遮蔽”的问题。

#全局函数
def outdef ():
    name = "所在函数中定义的 name 变量"
    #局部函数
    def indef():
        print(name)
        name = "局部函数中定义的 name 变量"
    indef()
#调用全局函数
outdef()
#UnboundLocalError: local variable 'name' #referenced before assignment

nonlocal 关键字

#全局函数
def outdef ():
    name = "所在函数中定义的 name 变量"
    #局部函数
    def indef():
        nonlocal name
        print(name)
        #修改name变量的值
        name = "局部函数中定义的 name 变量"
    indef()
#调用全局函数
outdef()
#所在函数中定义的 name 变量

lambda表达式

name = lambda [list] : 表达式
等同于如下:

def name(list):
    return 表达式
name(list)
add = lambda x,y:x+y
print(add(3,4))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值