一、函数的初始
比如python没有len()方法,如果求字符串的长度
使用for循环
s = 'asdfadsf' count = 0 for i in s: count += 1 print(count)
列表呢?
li = [1,2,3,'a','b','c','ask'] count = 0 for i in li: count += 1 print(count)
如果是字典呢?再把上面的代码贴一遍?可以看出2点:
1.重复代码多
2.可读性差
写代码,一切以精简为主,避免重复代码。
针对这种情况,出现了函数
函数是组织好的,可重复使用的,用来实现单一,或i相关联功能的代码段。
函数的产生:
函数就是封装一个功能的代码片段。
def my_len(): #def 关键字,定义一个函数 # my_len 函数名的书写规则与变量一样。 # def 与函数名中间一个空格 # 函数名():加上冒号(将函数名与函数体隔开),括号是用来传参的。 # 函数体 就是函数里面的逻辑代码 count = 0 for j in li: count += 1 print(count)
以上就是一个函数
代码是从上至下执行的,执行到def my_len()时,将my_len这个变量名加载到临时内存中,它不执行。函数如何执行呢?
函数的执行:函数名+()
# 执行函数 my_len()
当见到my_len()时,只有见到这个括号(),程序会根据函数名从内存中找到函数体,然后执行它,没有括号,它是不会执行的。
二、函数返回值
写函数,不要在函数中写print()。函数是以功能为导向的,除非测试的时候,才可以写print()。
1.在函数中,遇到return结束函数。
def func(): print(111) return print(444) func()
2.将值返回给函数的调用者。
def func(): a = 134 return a print(func())
1.无return
def func(): pass print(func())
2.return None(没有意义)
def func(): return None print(func())
3.return 1个值 该值是什么,就直接返回给函数的调用者,函数名()
def func(): return [1,2,3] print(func())
4.return 多个值 将多个值放到一个元组里,返回给函数的调用者。
def func(): return 1,2,[33,44],'abc' print(func())
li = [1,2,3,'a','b','c','ask'] def my_len(): count = 0 for j in li: count += 1 return count print(my_len())
查看len方法的编码
def len(*args,**kwargs): pass
pass表示使用C写的。发现my_len()和len()方法,有些类似了。能返回变量的长度了,但是和len()有些区别。len可以传参数,比如len('123')
三、函数的传参
def my_len(l): # l 形式参数,形参 print(l) # 实际对应就是a count = 0 for j in l: count += 1 return count a = 'fasdf' print(my_len(a)) # 括号里面的是实际参数,实参
实参角度:
1.位置传参。按顺序,一一对应
def func(a,b,c): print(a) print(b) print(c) func('asdfljasfd',3,4)
如果少一个参数呢?
def func(a,b,c): print(a) print(b) print(c) func(3,4)
执行报错
TypeError: func() missing 1 required positional argument: 'c'
必须是一一对应的。
2.关键字传参,不按顺序,一一对应。
def max_min(a,b): return a if a > b else b print(max_min(b = 1, a = 3))
3.混合传参,关键字参数永远在最后面
def func(a,b,c,d,e): print(a) print(b) print(c) print(d) print(e) func(1,2,c=3,4,5)
执行报错:
SyntaxError: positional argument follows keyword argument
正确的写法:
def func(a,b,c,d,e): print(a) print(b) print(c) print(d) print(e) func(1,4,d=2,c=3,e=5)
按照形参角度。
1.位置传参。按顺序,一一对应。
def func(a,b,c): print(a) print(b) print(c) func('asdf',3,4)
2.默认参数,传参则覆盖,不传则默认,默认参数永远在位置参数后面
def func(a,b=666): print(a,b) func(1,2)
def func(a,b=666): print(a,b) func(1)
举一个场景
班主任录入员工信息表
while True: username = input('请输入姓名:').strip() sex = input('请输入性别:').strip() with open('name_list',encoding='utf-8',mode='a') as f1: f1.write('{}\t{}\n'.format(username.sex))
查看文件内容
有2个问题。第一,男生居多。第二,完成函数功能。修改 一下如下:
def Infor_entry(username,sex='男'): with open('register_msg.txt',encoding='utf-8',mode='a') as f1: f1.write('{}\t{}\n'.format(username,sex)) while True: username = input('请输入姓名(男生以1开头):').strip() if '1' in username: #去除1 username = username[1:] Infor_entry(username) else: Infor_entry(username,'女')
四、三元运算
三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值
格式: [on_true] if [expression] else [on_false]
res = 值1 if条件 else 值2
三元运算只适用于简单的if else判断,再多一层if判断就不适用了。
举例说明:
a = 1 b = 2 c = a if a > b else b #如果a大于1的话,c=a,否则c=b
写一个函数,功能比大小,大者返回
def max_min(a,b): if int(a) > int(b): return a else: return b print(max_min(1,3))
上面的max_min函数,可以使用三元运算进行简写
def max_min(a,b):return a if a > b else b
今日作业:
练习题
1
、整理函数相关知识点,写博客
2
、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
3
、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于
5
。
4
、写函数,检查传入列表的长度,如果大于
2
,那么仅保留前两个长度的内容,并将新内容返回给调用者。
5
、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数,并返回结果。
6
、写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容,并返回结果。
7
、写函数,检查传入字典的每一个value的长度,如果大于
2
,那么仅保留前两个长度的内容,并将新内容返回给调用者。
dic
=
{
"k1"
:
"v1v1"
,
"k2"
: [
11
,
22
,
33
,
44
]}
PS:字典中的value只能是字符串或列表
8
、写函数,接收两个数字参数,返回比较大的那个数字。
9
、写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作(进阶)。
10
、写一个函数完成三次登陆功能,再写一个函数完成注册功能(进阶)
明日默写。
①,
return
的作用。
②,传参的几种方法,每个都简单写一个代码。
如,实参,按位置传参。
def
func(x,y):
Pass
func(
'a'
,
'b'
)
答案:
第二题:
def func1(argv):return argv[1::2] print(func1([1,2,3,4]))
第三题:
def func1(argv):return len(argv) > 5 print(func1([1,2,3,4,5,6,7,8]))
第四题:
def func1(args): return args[:2] if len(args) > 2 else args print(func1([1,2,3,4,5]))
第五题:
def func(argv): dic = {'digit':0,'aplha':0,'space':0,'other':0} for i in argv: if i.isdigit(): dic['digit'] += 1 elif i.isalpha(): dic['aplha'] += 1 elif i.isspace(): dic['space'] += 1 else: dic['other'] += 1 return '数字{},字母{},空格{},其它'.format(dic['digit'],dic['aplha'],dic['space'],dic['other']) print(func('4566asf &*(^&adf654664 flk'))
第六题:
def contain_space(data): for i in data: if i == ' ': flag = True break else: flag = False return '对象含有空格' if flag else '对象没有空格' data = 'asfj asdfk' print(contain_space(data))
第7题:
def func(argv): for i in argv: argv[i] = argv[i][:2] return argv dic = {'k1':'v1v1','k2':[11,22,33,44]} print(func(dic))
第8题:
def max_min(a,b):return a if a > b else b print(max_min(5,8))
第9题: