python 函数初识
*—*—python函数初识—*—*
一、函数的初识
若我们不使用len方法,该如何实现求字符串的长度?
答:使用for循环
s = 'tiancai' count = 0 for i in s: count += 1 print(count)
执行输出:
7
list列表
lis = ['aa','bb',11,22,'abc','天才'] count = 0 for i in lis: count += 1 print(count)
执行输出:
6
以上写法有2点不好的地方:
1.重复的代码多
2.代码的可读性差
写代码应当避免重复代码,以简化代码为荣。
对于这种情况,出现了函数这么个东东
函数是封装好的,拿来就可以使用,用来实现单一或相关联功能的代码段。
函数:函数就是内部封装了一个功能的代码片段。
def func(): #def 函数名(): 定义一个函数 #函数名的书写规则跟变量一样 #def与函数名直接有一个空格 #def 函数名():冒号用来将函数名与函数体隔开,不能少,括号用来传参 #函数体是函数里面的逻辑代码 print(666) print(999)
代码是由上往下依次执行的,执行到def func()时
将func这个函数名加载到临时内存中,不执行。
那么函数如何执行呢?
函数的执行方法:函数名()
#执行函数 func()
当见到func(),只有见到()时,程序才会根据函数名从内存中找到函数体,然后执行它。没有括号是不会执行的。
二、函数的返回值 return
写函数,不要在函数内写print()
函数是以功能为导向,一般只有在测试中才可以写print()
return返回的值需要print才能打印显示出来
1.在函数当中,遇到return立即结束函数 。
def func(): print(666) return print(999) func()
执行输出:
666
2.将返回值返回给函数调用者。
def func(): s = '天才' return s print(func())
执行输出:
天才
return的几种情况
1.无return 返回None
def func(): print(123) print(func())
执行输出:
None
2.有return 返回None
def func(): return None #没有意义 print(func())
执行输出:
None
3.return 单个值 该值是什么,就直接返回给函数的调用者——函数名()
def func(): return 1 #return单个值 print(func()) def fun(): return [1,2,3] #return单个值[1,2,3] print(fun())
执行输出:
1
[1,2,3]
4.return 多个值 将多个值放到一个元组里,返回给函数的调用者。
def func(): return 1,'a',[11,12] print(func())
执行输出:
(1, 'a', [11, 12])
lis = [1,2,3,'aaa','天才'] def func_len(): count = 0 for i in lis: count +=1 return count print(func_len())
执行输出:
5
my_len()和len()方法,看起来好像有些类似,都能返回变量的长度,但是和len()有区别。len可以传参数,比如len('abc')
三、函数的传参
def my_len(l): # l 形式参数,形参 print(l) #实际对应就是s count = 0 for i in l: count += 1 return count s = 'tiancai' print(my_len(s)) #括号里面的是实际参数,实参
执行输出:
tiancai
7
实参角度:
1.位置传参。按顺序,一一对应。
def func(a,b,c): print(a) print(b) print(c) func('tiancai',3,4)
执行输出:
tiancai
3
4
那么,少传一个参数会怎么样呢?
def func(a,b,c): print(a) print(b) print(c) func(1,2)
TypeError: func() missing 1 required positional argument: 'c'
必须一一对应,否则报错
2.关键字传参,不按顺序,一一对应。
def func(a,b): print(a) print(b) print(a,b) func(b =2, a =1)
执行输出:
1
2
1 2
3.混合传参,关键字参数在最后面
def func1(a,b,c,d): print(a) print(b) print(c) print(d) func1(1,2,c=3,4)
执行输出:
SyntaxError: positional argument follows keyword argument
正确使用姿势
def func1(a,b,c,d): print(a) print(b) print(c) print(d) func1(1,2,c =3, d =4)
执行输出:
1
2
3
4
形参角度:
1.位置传参。按照顺序一一对应。
def func(a,b,c): print(a) print(b) print(c) func('天才',3,4)
执行输出:
天才
3
4
2.默认参数。传参则覆盖,不传则默认,默认参数永远在位置参数后面
def func(a,b=123): print(a,b) func(1,2)
执行输出:
1 2
def func(a,b=123): print(a,b) func(1)
执行输出:1 123
场景应用:
员工信息表录入
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个需求
1.男女一样多
2.完成函数功能
修改如下
def Infor_entry(username,sex='男'): with open('name_list',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,'女')
执行输出:
查看文件:
四、三元运算
三元运算就是可以在给一个变量赋值的时候,可以直接加判断再赋值
s = 值1 if 条件 else 值2
例如:
a =100 b = 99 c= a if a>50 else b #如果a大于50的话,c=a,否则c=b
print(c)
执行输出:
100
写一个拥有比大小功能的函数,返回数值较大的数
def max_min(a,b): if int(a) > int(b): return a else: return b print(max_min(1,5))
执行输出:
5
上面那样写代码太low了,我们可以用优雅的三元运算进行优化,代码如下
def max_min(a,b): return a if a > b else b
练习题:待续