# 函数
# 可读性强 复用性强
# def 函数名():
# 函数体
#return 返回值
# 所有的函数 只定义不调用就一定不执行
#先定义后调用
#函数名() #不接收返回值
#返回值 = 函数名() #接收返回值
#返回值
# 没有返回值 :默认返回None
# 不写return:函数内的代码执行完毕自动结束
# 只写return:结束一个函数
# return None
# 返回一个值 :结束了函数且返回一个值,可以是任意的值
# 返回多个值 : 多个值之间用逗号隔开,接收的时候可以用一个变量接收(元组),也可以用等量的多个变量接收
# def f(a):
# return '栗子'
#
# ret = f('苹果')
# print(f('苹果'))
#参数
#形参 定义函数的时候
# 位置参数 :必须传
# *args :动态参数 可以接收任意多个按位置传入的参数
# 默认参数 : 可以不传 —— 陷阱
# **kwargs : 动态参数 可以接受任意多个按关键字传入的参数
#实参 调用函数的时候
# 按照位置传参数
# 按照关键字传参数
# 可以混用 位置参数必须在关键字传参之前
# 不能对一个参数重复赋值
# def 娃哈哈(*args):
# print(args)
#
# # 娃哈哈(1,2,3,4)
# l = [1,2,3,4]
# 娃哈哈(*l)
默认参数的陷阱
def qqxing(l = []): l.append(1) print(l) qqxing() #[1] qqxing([]) #[1] qqxing() #[1,1] qqxing() #[1, 1, 1] # 如果默认参数的值是一个可变数据类型, # 那么每一次调用函数的时候, # 如果不传值就公用这个数据类型的资源 def qqxing(l = {}): # l.append(1) l['k'] = 'v' print(l) qqxing() #{'k': 'v'} qqxing() #{'k': 'v'} qqxing() #{'k': 'v'} def qqxing(k,l = {}): # l.append(1) l[k] = 'v' print(l) qqxing(1) #{1: 'v'} qqxing(2) #{1: 'v', 2: 'v'} qqxing(3) #{1: 'v', 2: 'v', 3: 'v'} def qqxing(k, l = {}): # l.append(1) l[k] = 'v' print(l) qqxing(1) #{1: 'v'} qqxing(2, l={}) #{2: 'v'} qqxing(3) #{1: 'v', 3: 'v'}
习题
#2、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。 def func(l): return l[1::2] #切片 print(func([1,2,3,4,5,6])) #或者 def func(l): a = [] l = l[1::2] for i in l: a.append(i) return a print(func([1,2,3,4,5,6])) # 3、写函数,判断用户传入的值(字符串、列表、元组)长度是否大于5。 def func(x): return len(x)>5 if func('abcd'): print('长度确实大于5') # 4、写函数,检查传入列表的长度,如果大于2, #那么仅保留前两个长度的内容,并将新内容返回给调用者。 def func(l): return l[:2] print(func([1,2,3,4])) # 5、写函数,计算传入字符串中【数字】、【字母】、【空格】 以及 【其他】的个数,并返回结果。 def func(s): #'skghfoiw8qpeuqkd' # num=0 # alpha=0 # space=0 # other=0 dic = {'num':0,'alpha':0,'space':0,'other':0} for i in s: if i.isdigit(): # isdigit() 方法检测字符串是否只由数字组成。 dic['num']+=1 elif i.isalpha(): # isalpha() 方法检测字符串是否只由字母组成。 dic['alpha'] += 1 elif i.isspace(): # isspace() 方法检测字符串是否只由空格组成。 dic['space'] += 1 else: dic['other'] += 1 return dic print(func('+0-0skahe817jashf wet1')) # 6、写函数,检查用户传入的对象(字符串、列表、元组) #的每一个元素是否含有空内容,并返回结果。 def func(x): if type(x) is str and x: #参数是字符串 for i in x: if i == ' ': return True elif x and type(x) is list or type(x) is tuple: #参数是列表或者元组 for i in x: if not i: return True elif not x: return True print(func([])) #7、写函数,检查传入字典的每一个value的长度,如果大于2, #那么仅保留前两个长度的内容,并将新内容返回给调用者。 # dic = {"k1": "v1v1", "k2": [11,22,33,44]} # PS:字典中的value只能是字符串或列表 def func(dic): for k in dic: if len(dic[k]) > 2: dic[k] = dic[k][:2] return dic dic = {"k1": "v1v1", "k2": [11,22,33,44]} print(func(dic)) # 8、写函数,接收两个数字参数,返回比较大的那个数字。 def func(a,b): if a>b: return a else: return b print(func(1,5)) def func(a,b): return a if a > b else b print(func(5,1)) # 三元运算 a = 1 b = 5 c = a if a>b else b #三元运算 print(c) # 变量 = 条件返回True的结果 if 条件 else 条件返回False的结果 #必须要有结果 #必须要有if和else #只能是简单的情况 # 9、写函数,用户传入修改的文件名,与要修改的内容, # 执行函数,完成整个文件的批量修改操作(进阶)。 def func(filename,old,new): with open(filename, encoding='utf-8') as f, open('%s.bak'%filename, 'w', encoding='utf-8') as f2: for line in f: if old in line: # 班主任:星儿 line = line.replace(old,new) # 写文件 f2.write(line) # 小护士:金老板 import os os.remove(filename) # 删除文件 os.rename('%s.bak'%filename, filename) # 重命名文件