发布时间:2018-03-29 15:46:29编辑:Run阅读(3900)
比如python没有len()方法,如何求字符串长度,使用for循环
s = 'dadhhrqlasd' count = 0 for i in s: count += 1 print(count)
执行输出
11
求列表呢?
l1 = [1, 2, 3, 4, 5, 'a', 'b', 'c', 'abc', 10] count = 0 for j in l1: count += 1 print(count)
执行结果
10
通过上面两个例子,可以看出方法都是使用的同一个,但是重复代码多,可读性差
写代码
函数的产生:
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.
函数能提高应用的模块性,和代码的重复利用率。已经知道python提高了许多内建函数,比如print(),len()等。但你也可以自己创建函数,这被叫做用户自定义函数。
l1 = [1, 2, 3, 4, 5, 'a', 'b', 'c', 'abc', 10] def my_len(): # def关键字 定义一个函数 # my_len函数名的书写规则与变量一样 # def与函数名中间有一个空格(规定) # 函数名():加上冒号(将函数名与函数体隔开) # 函数体,就是函数里面的逻辑代码 count = 0 for j in l1: count += 1 print(count) # 执行函数 my_len()
输出结果
10
代码是从上向下执行的,在执行my_len()时,将my_len加载到内存中,中间逻辑不读,将代码打包一下,放到临时内存中,它不执行
函数的返回值
用len()方法时,得到的结果会赋值给一个变量,然后得到结果
print(len('hello,world'))
结果为: 11
但是之前写的函数,并不会得到这样的结果,如何让它和len函数一样,有返回值呢?
那就是在函数的最后加上一个return, return后面写你需要的返回值就可以了
例子
def my_len(): """计算s1的长度""" s1 = 'hello world' count = 0 for i in s1: count += 1 return count # 函数调用 print(my_len())
结果为11
下面研究下return关键字的作用
return关键字的作用
return是一个关键字,在pycharm里,你会看到它变成蓝色
这个词翻译过来就是返回的意思,所以我们写在return后面的值叫"返回值",要研究返回值,返回值有几种情况:分别是没有返回值,返回一个值,返回多个值
没有返回值
不写return的情况下,会默认返回一个None:
例子
def my_len(): """计算s1的长度""" s1 = 'hello world' count = 0 for i in s1: count += 1 print(count) # 函数调用 str_len = my_len() # 因为没有返回值,此时的str_len为None print(str_len)
只写return,后面不写其它内容,也会返回None,既然没有要返回的值,完全可以不写return,为什么还要写个return呢?,这就是return的其它用法,就是一旦遇到return,结束整个函数
例子
def tmp_demo(): print(111) return print(222) res = tmp_demo() print(res)
结果为
111
None
return None:返回了一个None和上面的例子一样,只打印了前面的111,说明后面的222没有被执行
返回一个值
只需要在return后面写上要返回的内容即可
例子
# 函数定义 def my_len(): """计算s1的长度""" s1 = 'hello world' count = 0 for i in s1: count += 1 return count # 函数调用 print(my_len())
结果为:11
返回多个值,将多个值放到一个元组里,返回给函数的调用者
例子
def tmp_demo2(): '''返回多个值''' return 1,['a','b'],2,3,4 print(tmp_demo2())
输出结果
(1, ['a', 'b'], 2, 3, 4)
函数的传参
def my_len(l): # l形式参数,形参 count = 0 for i in l: count += 1 return count a = 'abcdefg' print(my_len(a)) #括号里面的a是实际参数,实参
执行输出
7
函数的传参
两方面:
实参角度:
1.位置传参 按顺序,一一对应。
例子
def func(a,b,c): print(a) print(b) print(c) func(2,3,4)
输出结果
2,3,4
实例:写一个函数,功能比大小,大的返回
def max_min(a, b): if int(a) > int(b): return a else: return b print(max_min(1, 3))
执行结果
3
三元运算
简单的if和else判断,就可以用三元运算
上面函数的简写
def max_min(a,b): z = a if a > b else b return z print(max_min(10,2)) # 进一步简写 def max_min(a, b): return a if a > b else b print(max_min(10,20))
2 关键字传参,不安顺序,一一对应
比如:
def max_min(a,b): return a if a > b else b print(max_min(b=10, a=20))
执行结果
20
错误的示例
def func1(a,b,c,d,e): print(a) print(b) print(c) print(d) print(e) func1(1,2,c=3,4,5)
执行报错
注意:位置参数,永远在位置参数的后面
即改成
def func1(a,b,c,d,e): print(a) print(b) print(c) print(d) print(e) func1(1,2,c=3,d=4,e=5) #或者 func1(1,2,3,4,e=5)
3 混合参数,关键字参数永远在最后面
实参角度:
1,位置传参。按顺序,一一对应
2,关键字传参,不按顺序,一一对应
3,混合传参,关键字参数永远在位置参数的后面
按照形参角度
1,位置传参,按顺序,一一对应
例子
def func(a,b,c): print(a) print(b) print(c) func('abc',3,4)
执行结果
abc
3
4
2. 默认参数
def func(a, b=666): print(a,b) func(1,2)
执行结果
1 2
def func(a, b=666): print(a,b) func(1)
执行结果
1 666
形参角度:
1.位置传参,按顺序,一一对应
2.默认参数,传参则覆盖,不传则默认
实例,录入员工信息表,使用函数封装
def infor_entry(username,sex='男'): with open('name_list', encoding='utf-8', mode='a') as f: f.write('{}\t{}\n'.format(username,sex)) while True: username = input("请输入姓名(男生以1开头)").strip() if '1' in username: username = username[1:] infor_entry(username) else: infor_entry(username,'女')
执行后的name_list结果为
下面看个例子
错误示例
def func(b=666,a): print(a,b) func(1,2)
执行报错
默认参数必须在位置参数的后面
形参角度:
1,位置传参。按顺序,一一对应
2,默认参数。传参则覆盖,不传则默认,默认参数永远在位置参数后面
本章节练习题
#!/usr/bin/env python # coding: utf-8 __author__ = 'www.py3study.com' # 2、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。 # 方法1 # def func(l): # new_list = [] # for i in range(len(l)): # if i % 2 == 1: # new_list.append(l[i]) # return new_list # print(func((1,2,3,4,5,6,7,8,9))) # 方法2 # def func(l): # l = l[1::2] # return l # print(func((1,2,3,4,5,6,7,8,9))) #方法3 # def func1(argv):return argv[1::2] # print(func1((1,2,3,4,5,6,7,8,9))) # 3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。 # 方法一 # def func(l): # if len(l) > 5: # return True # else: # return False # print(func('abcdef')) # 方法二 # 因为它是一个不等式,结果不是True就是False,所以可以用三元运算 # def func(l): # return True if len(l) > 5 else False # print(func('abcdef')) # 4、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。 # 方法1 # def func(l): # if len(l) > 2: # l = l[:2] # else: # l = l # return l # print(func([1,2,3,4])) # 方法2 # def func(l): # return l[:2] if len(l) > 2 else l # print(func([1,2,3,4])) # 方法3,即使小于2,也可以切片,返回原来的值,切片不会报错 # def func(argv): # return argv[:2] # print(func([1,2,3,4])) # 5、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数,并返回结果。 # def func(argv): # dic = {'digit':0,'alpha':0,'space':0,'other':0} # for i in argv: # #判断是否为数字 # if i.isdigit(): # dic['digit'] += 1 # #判断是否为字母 # elif i.isalpha(): # dic['alpha'] += 1 # #判断是否为空格 # elif i.isspace(): # dic['space'] += 1 # else: # dic['other'] += 1 # return '数字{},字母{},空格{},其它{}'.format(dic['digit'],dic['alpha'],dic['space'],dic['other']) # print(func('sfsf 1231 fyi324#@%#%@! fd12')) # 7、写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。 # dic = {"k1": "v1v1", "k2": [11,22,33,44]} # PS:字典中的value只能是字符串或列表 # 方法一 # dic = {"k1": "v1v1", "k2": [11,22,33,44]} # print(len(dic)) # def fun(dic): # for x,y in dic.items(): # if len(y) > 2: # y = y[:2] # dic[x] = y # return dic # print(fun(dic)) # 方法二 # def fun(dic): # for i in dic: # if len(dic[i]) > 2: # dic[i] = dic[i][:2] # return dic # print(fun(dic = {"k1": "v1v1", "k2": [11,22,33,44]})) # 方法3,代码优化 # def fun(dic): # for i in dic: # dic[i] = dic[i][:2] # return dic # print(fun(dic = {"k1": "v1v1", "k2": [11,22,33,44]})) # 8、写函数,接收两个数字参数,返回比较大的那个数字。 # def fun1(x,y): # return x if x > y else y # print(fun1(5,10)) # 9、写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作(进阶)。 # import os # def fun1(x,y,z): # with open(x,encoding='utf-8',mode='r') as f1,\ # open('x.bak',encoding='utf-8',mode='w') as f2: # for i in f1: # new_i = i.replace(y,z) # f2.write(new_i) # os.remove(x) # os.rename('x.bak', x) # fun1('zuoye7.txt','zhangsan','lisi') # 10、写一个函数完成三次登陆功能,再写一个函数完成注册功能(进阶) # class Login(object): # def __init__(self): # print("欢迎访问!首次登陆,请注册一个账号!") # self.name_and_pwd = [] # self.account_registration() # def account_registration(self): # while True: # self.username = input('请输入账户名:').strip() # if self.username.isdigit(): # print("账号不能为纯数字") # else: # self.name_and_pwd.append(self.username) # self.password = input("请输入密码:").strip() # self.again_password = input("再次输入密码确认:").strip() # if self.password == self.again_password: # print("账号注册成功") # self.name_and_pwd.append(self.again_password) # self.sign_in() # else: # print("两次输入的密码不一致!") # def sign_in(self): # max = 3 # count = 0 # while count < max: # count += 1 # username = input("账号:").strip() # if username == self.name_and_pwd[0]: # password = input("密码:").strip() # if password == self.name_and_pwd[1]: # print("登陆成功!") # exit() # else: # print("密码不存在") # else: # print('账号不存在!') # print('剩余{}次机会'.format(max-count)) # if max - count == 0: # exit() # # if __name__ == '__main__': # st = Login()
上一篇: python3--文件操作
下一篇: python3--函数进阶
47745
46236
37110
34627
29229
25886
24745
19863
19417
17909
5716°
6315°
5835°
5888°
6985°
5829°
5846°
6361°
6316°
7673°