Python中的函数

一、三元运算

三元运算(三目运算),是对简单的条件语句的缩写。

# 书写格式
result =1 if 条件 else2

# 如果条件成立,那么将 “值1” 赋值给result变量,否则,将“值2”赋值给result变量

二、其他基本数据类型

对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
1、赋值
赋值,只是创建一个变量,该变量指向原来内存地址,如:

n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
n2 = n1

2、浅拷贝
浅拷贝,在内存中只额外创建第一层数据

import copy
n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
n3 = copy.copy(n1)

3、深拷贝
深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

import copy
n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
n4 = copy.deepcopy(n1)
print(n4)

函数

一、定义和使用

def 函数名(参数):
...
函数体
...
返回值

函数的定义主要有如下要点:
•**def:**表示函数的关键字
•函数名:函数的名称,日后根据函数名调用函数
**•函数体:**函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等…
**•参数:**为函数体提供数据
**•返回值:**当函数执行完毕后,可以给调用者返回数据。

1、返回值
函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
以上要点中,比较重要有参数和返回值:


def 发送短信():

    发送短信的代码...
    
    if 发送成功:
        return True
    elsereturn False
        
while True:
    # 每次执行发送短信函数,都会将返回值自动赋值给result

    # 之后,可以根据result来写日志,或重发等操作
    result = 发送短信()

    if result == False:
    
        记录日志,短信发送失败...

2、参数

无参实现

def CPU报警邮件()
    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接

def 硬盘报警邮件()
    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接

def 内存报警邮件()
    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接
 
while Trueif cpu利用率 > 90%:
        CPU报警邮件()
        
    if 硬盘使用空间 > 90%:
        硬盘报警邮件()
        
    if 内存占用 > 80%:
        内存报警邮件()
无参数实现

有参实现:

def 发送邮件(邮件内容)

    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接
while Trueif cpu利用率 > 90%:
        发送邮件("CPU报警了。")
 
    if 硬盘使用空间 > 90%:
        发送邮件("硬盘报警了。")
 
    if 内存占用 > 80%:
        发送邮件("内存报警了。")

有参数实现

函数的有三中不同的参数:
•普通参数
•默认参数
•动态参数

普通参数:

# ######### 定义函数 ######### 

# name 叫做函数func的形式参数,简称:形参
def func(name):
    print name
# ######### 执行函数 ######### 

#  'wupeiqi' 叫做函数func的实际参数,简称:实参
func('wupeiqi')
普通参数

默认参数:

def func(name, age = 18):
    
    print "%s:%s" %(name,age)

# 指定参数
func('wupeiqi', 19)
# 使用默认参数
func('alex')
注:默认参数需要放在参数列表最后
默认参数

动态参数:

def func(*args):

    print args

# 执行方式一
func(11,33,4,4454,5)

# 执行方式二
li = [11,2,2,3,3,4,54]
func(*li)
动态参数
def func(**kwargs):
    print(kwargs)

# 执行方式一
func(name='weixin',age=18)
# 执行方式二
li = {'name':'wupeiqi','age':18,'gender':'male'}
func(**li)
动态参数
def func(*args, **kwargs):
    print args
    print kwargs

open函数,该函数用于文件处理
操作文件时,一般需要经历如下步骤:
•打开文件
•操作文件
一、打开文件

文件句柄 = open('文件路径', '模式')

打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

打开文件的模式有:
•r ,只读模式【默认】
•w,只写模式【不可读;不存在则创建;存在则清空内容;】
•x, 只写模式【不可读;不存在则创建,存在则报错】
•a, 追加模式【可读; 不存在则创建;存在则只追加内容;】

“+” 表示可以同时读写某个文件
•r+, 读写【可读,可写】
•w+,写读【可读,可写】
•x+ ,写读【可读,可写】
•a+, 写读【可读,可写】

"b"表示以字节的方式操作
•rb 或 r+b
•wb 或 w+b
•xb 或 w+b
•ab 或 a+b

注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型

二、管理上下文
为了避免打开文件后忘记关闭,可以通过管理上下文,即:

with open('log','r') as f:
    ...

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

lambda表达式

学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即:


# 普通条件语句
if 1 == 1:
    name = 'wupeiqi'
else:
    name = 'alex'

# 三元运算
name = 'wupeiqi' if 1 == 1 else 'alex'

对于简单的函数,也存在一种简便的表示方式,即:lambda表达式

# ###################### 普通函数 ######################

# 定义函数(普通方式)

def func(arg):

    return arg + 1

# 执行函数

result = func(123)

# ###################### lambda ######################

# 定义函数(lambda表达式)
my_lambda = lambda arg : arg + 1

# 执行函数
result = my_lambda(123)

递归

利用函数编写如下数列:
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…

def func(arg1,arg2):
    if arg1 == 0:
        print arg1, arg2
    arg3 = arg1 + arg2
    print arg3
    func(arg2, arg3)
    
func(0,1)

练习题

练习题

1、简述普通参数、指定参数、默认参数、动态参数的区别

2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数

def count_str(strs):
    """计算字符串中数字,字母,空格及其他的个数"""
    #  【数字】、【字母】、【空格] 以及 【其他】初始化个数
    int_count,str_count,spa_count,other_count = 0,0,0,0
    for i in strs:     #  遍历字符串
        if i.isdigit():   # 判断是否为数字
            int_count += 1
        elif i.isalnum():   # 判断是否为字母
            str_count += 1
        elif i.isspace():   # 判断是否为空格
            spa_count += 1
        else:
            other_count +=1
    # 最后输出
    print("字符串s中,数字个数={},字母个数={},空格个数={},其他个数={}".format(int_count,str_count,spa_count,other_count))

if __name__ == "__main__":
    strs = input("请输入字符串s:")
    count_str(strs)   # 调用函数

3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。

def changdu(strs):
    """计算字符串中数字,字母,空格及其他的个数"""
    #  写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
    a = len(strs)
    if a>5:
        print("True")
    else:
        print('False')
if __name__ == "__main__":
    strs = input("请输入字符串s:")
    changdu(strs)   # 调用函数

4、写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。

def changdu(strs):
    """计算字符串中数字,字母,空格及其他的个数"""
    #  写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
    for i in strs:
        if i.isspace():
            print("有空元素")
            break

if __name__ == "__main__":
    strs = input("请输入字符串s:")
    changdu(strs)   # 调用函数

5、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。


def changdu(strs):
    """计算字符串中数字,字母,空格及其他的个数"""
    #  写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
    a = len(strs)
    if a>2:
        a = strs[:2]
    return a
if __name__ == "__main__":
    strs = input("请输入字符串s:")
    a = changdu(strs)   # 调用函数
    print(a)

6、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。

def a3(arg):
    ret = [ ]
    for i in range(len(arg)):
        if i % 2 == 1:
            ret.append(arg[i])
        else:
            pass
    return ret
li = [11,22,33,44,55]
r = a3(li)
print(li)
print(r)

7、写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
dic = {“k1”: “v1v1”, “k2”: [11,22,33,44]}
PS:字典中的value只能是字符串或列表

dic = {"k1": "v1v1", "k2": [11,22,33,44]}
def f5(args):
    ret={}
    for key,value in args.items():
        if(len(value)>2):
            ret[key]=value[0:2]
        else:
            ret[key]=value
    return ret

r1=f5(dic)
print(r1)

8、写函数,利用递归获取斐波那契数列中的第 10 个数,并将该值返回给调用者。

def f1(a,a1,a2):
    if a == 10:
        return a1
    a3 = a1 + a2
    r = f1(a + 1,a2,a3)
    return r
ret = f1(1,0,1)
print(ret)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值