defstu_register(name,age,course='PY',country='CN'):print("----注册学生信息------")print("姓名:", name)print("age:", age)print("国籍:", country)print("课程:", course)if age >22:returnFalseelse:returnTrueregistriation_status =stu_register("王山炮",22,course="PY全栈开发",country='JP')if registriation_status:print("注册成功")else:print("too old to be a student.")
name ="Alex Li"defchange_name(name):print("before change:",name) name ="金角大王,一个有Tesla的男人"print("after change", name)change_name(name)print("在外面看看name改了么?",name)
输出
before change: Alex Liafter change 金角大王,一个有Tesla的男人在外面看看name改了么? Alex Li
不用传name 值到函数里,也可以在函数里调用外面的变量
name ="Alex Li"defchange_name(): name ="金角大王,一个有Tesla的男人"print("after change", name)change_name()print("在外面看看name改了么?", name)
name ="Alex Li"defchange_name():global name name ="Alex 又名 金角大王,路飞学城讲师"print("after change", name)change_name()print("在外面看看name改了么?", name)
global name的作用就是要在函数里声明全局变量name ,意味着最上面的name = "Alex Li"即使不写,程序最后面的print也可以打印name
嵌套函数
name ="Alex"defchange_name(): name ="Alex2"defchange_name2(): name ="Alex3"print("第3层打印", name)change_name2()# 调用内层函数print("第2层打印", name)change_name()print("最外层打印", name)
#compilef =open("函数递归.py")data =compile(f.read(),'','exec')exec(data)#printmsg ="又回到最初的起点"f =open("tofile","w")print(msg,"记忆中你青涩的脸",sep="|",end="",file=f)# #slice# a = range(20)# pattern = slice(3,8,2)# for i in a[pattern]: #等于a[3:8:2]# print(i)###memoryview#usage:#>>> memoryview(b'abcd')#<memory at 0x104069648>#在进行切片并赋值数据时,不需要重新copy原列表数据,可以直接映射原数据内存,import timefor n in (100000,200000,300000,400000): data = b'x'*n start = time.time() b = datawhile b: b = b[1:]print('bytes', n, time.time()-start)for n in (100000,200000,300000,400000): data = b'x'*n start = time.time() b =memoryview(data)while b: b = b[1:]print('memoryview', n, time.time()-start)几个内置方法用法提醒
练习题
修改个人信息程序
在一个文件里存多个人的个人信息,如以下
username password age position department
alex abc123 24 Engineer IT
rain df2@432 25 Teacher Teching
....
1.输入用户名密码,正确后登录系统 ,打印
1. 修改个人信息
2. 打印个人信息
3. 修改密码
2.每个选项写一个方法
3.登录时输错3次退出程序
练习题答案
defprint_personal_info(account_dic,username):""" print user info :param account_dic: all account's data :param username: username :return: None """ person_data = account_dic[username] info =''' ------------------ Name: %s Age : %s Job : %s Dept: %s Phone: %s ------------------ '''%(person_data[1], person_data[2], person_data[3], person_data[4], person_data[5], )print(info)defsave_back_to_file(account_dic):""" 把account dic 转成字符串格式 ,写回文件 :param account_dic: :return: """ f.seek(0)#回到文件头 f.truncate()#清空原文件for k in account_dic: row =",".join(account_dic[k]) f.write("%s\n"%row) f.flush()defchange_personal_info(account_dic,username):""" change user info ,思路如下 1. 把这个人的每个信息打印出来, 让其选择改哪个字段,用户选择了的数字,正好是字段的索引,这样直接 把字段找出来改掉就可以了 2. 改完后,还要把这个新数据重新写回到account.txt,由于改完后的新数据 是dict类型,还需把dict转成字符串后,再写回硬盘 :param account_dic: all account's data :param username: username :return: None """ person_data = account_dic[username]print("person data:",person_data) column_names = ['Username','Password','Name','Age','Job','Dept','Phone']for index,k inenumerate(person_data):if index >1:#0 is username and 1 is passwordprint("%s. %s: %s"%( index, column_names[index],k) ) choice =input("[select column id to change]:").strip()if choice.isdigit(): choice =int(choice)if choice >0and choice <len(person_data):#index不能超出列表长度边界 column_data = person_data[choice]#拿到要修改的数据print("current value>:",column_data) new_val =input("new value>:").strip()if new_val:#不为空 person_data[choice]= new_valprint(person_data)save_back_to_file(account_dic)#改完写回文件else:print("不能为空。。。")account_file ="account.txt"f =open(account_file,"r+")raw_data = f.readlines()accounts ={}#把账户数据从文件里读书来,变成dict,这样后面就好查询了for line in raw_data: line = line.strip()ifnot line.startswith("#"): items = line.split(",") accounts[items[0]]= itemsmenu ='''1. 打印个人信息2. 修改个人信息3. 修改密码'''count =0while count <3: username =input("Username:").strip() password =input("Password:").strip()if username in accounts:if password == accounts[username][1]:#print("welcome %s ".center(50,'-') % username )whileTrue:#使用户可以一直停留在这一层print(menu) user_choice =input(">>>").strip()if user_choice.isdigit(): user_choice =int(user_choice)if user_choice ==1:print_personal_info(accounts,username)elif user_choice ==2:change_personal_info(accounts,username)elif user_choice =='q':exit("bye.")else:print("Wrong username or password!")else:print("Username does not exist.") count +=1else:print("Too many attempts.")