一、三元运算
三元运算(三目运算),是对简单的条件语句的缩写。
# 书写格式
result = 值1 if 条件 else 值2
# 如果条件成立,那么将 “值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
else:
return False
while True:
# 每次执行发送短信函数,都会将返回值自动赋值给result
# 之后,可以根据result来写日志,或重发等操作
result = 发送短信()
if result == False:
记录日志,短信发送失败...
2、参数
无参实现
def CPU报警邮件()
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接
def 硬盘报警邮件()
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接
def 内存报警邮件()
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接
while True:
if cpu利用率 > 90%:
CPU报警邮件()
if 硬盘使用空间 > 90%:
硬盘报警邮件()
if 内存占用 > 80%:
内存报警邮件()
无参数实现
有参实现:
def 发送邮件(邮件内容)
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接
while True:
if 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)