python 新手函数基础(函数定义调用值传递等)
1、编程的集中主要方式:
面向过程 》类 》》关键字class
面向函数》函数 》》 关键字def
面向过程》 过程 》》 关键字def
2、python 函数是逻辑和结构化的集合。函数的定义和调用:
# Author : xiajinqi # 函数 def _print() : print("hello world") return 0 #函数调用 x= _print() # 函数返回结果 print(x) def _print() : print("hello world1") return 0 #过程 本质就是没有返回结果的函数 def _print() : print("hello world2") #函数调用 x= _print() # 函数返回结果 print(x) E:\Users\xiajinqi\PycharmProjects\twoday\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/twoday/function.py hello world 0 hello world2 None Process finished with exit code 0
3、函数的相互调用,以及使用函数的有点,减少重复代码,扩展性强。是逻辑更加清晰合理。
# Author : xiajinqi # 函数 import sys,time def logger(): time_format ='%Y-%m-%d' time_current = time.strftime(time_format) with open("test100.txt","a+",encoding="utf-8") as f : f.write("log end %s \n" %time_current) return 0 def test2() : logger() print("第一次写入") return 0 def test1() : logger() print("第二次写入") return 0 def test3() : logger() print("第三次写入") return 0 def test4() : logger() print("第四次写入") return 0 test1() test2() test3() test4()
4、函数的值传递 。返回值。return 后面的代码不执行。并且return可以返回任意值。元组,数组等任意多个值,返回多个值时候是一个元组
# 函数值传递,简单传递 def _print_name(x): print("你的名字是 %s" %x) return 0 _print_name("xiajinqi") # Author : xiajinqi # 函数值传递,定义返回值 def _print_name(x): print("你的名字是 %s" %x) return x,['test1','test2','text3'],'test' print("return 后面的语句不执行") _print_name("xiajinqi") print(_print_name('xiajinqi'))
E:\Users\xiajinqi\PycharmProjects\twoday\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/twoday/function.py 你的名字是 xiajinqi 你的名字是 xiajinqi ('xiajinqi', ['test1', 'test2', 'text3'], 'test')
Process finished with exit code 0
5.函数值传递的几种方式。值传递、
# Author : xiajinqi # 函数值传递,定义返回值 def _print_name(x,y): print(x,y) def _print_name1(x,y,z): print(x,y,z) x = 100 y = 200 _print_name(100,y=300) # 位置参数和关键字参数 _print_name1(100,200,z=100) # _print_name1(100,z=100,200) #报错,关键字参数不能再位置参数前面
6、不定参数的使用
# Author : xiajinqi # 函数值传递,定义返回值 def _print_name(x,y): print(x,y) def _print_name1(x,y,z): print(x,y,z) #默认参数 _print_name2(x,y=11,z)报错,位置参数不能再形式参数前面 def _print_name2(x,y=11,z=222): print(x,y,z) # 不定参数 def _print_name4(x,*args): print(x) print(args) print(args[1]) # 传一个字典,把关键字转化为字典 def _print_name5(**kwargs): print(kwargs) x = 100 y = 200 test= ['test1','test2','test3'] test1 = {'name':'xiajinqi','age':'222'} _print_name(100,y=300) # 位置参数和形式参数 _print_name1(100,200,z=100) # #_print_name1(100,z=100,200) #报错,位置参数不能在形式参数前面 _print_name2(100,2222,1000) _print_name4(100,*["100","200",'300']) _print_name4(*test) _print_name5(**test1) _print_name5(**{'name':'xiajinqi'})
7、全局变量和局部变量:
# 字符串,整形等不能在局部变量中修改,列表、字典等可以在局部变量可以直接修改,如果不想改变,可以设置为元组 name = "xiajinqi" age =88 #全局变量 name1 = ['test','xiajinqi','wangwu'] def change_name(): age =100 #作用范围为函数范围内,只改变对全局变量没有影响 global name #申明为全局变量 name = "test" return 0 def change_name2(): name1[0] = 'test2' return 0 change_name() print(age) change_name2() print(name1) E:\Users\xiajinqi\PycharmProjects\twoday\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/twoday/function.py 88 ['test2', 'xiajinqi', 'wangwu'] Process finished with exit code 0
8、作业题目,实现对haproxy配置文件实现增删改查
#!/usr/bin/python #实现对nginx 配置文件实现增删改查 #1查询 #2增加 #3、删除 import time import shutil,os file_name = "nginx.conf" #查找 def file_serach(domain_name): flag = "false" list_addr = [] with open(file_name,"r",encoding="utf-8") as f : for line in f : if line.strip() == "backend %s" %(domain_name) : list_addr.append(line) flag = "true" continue if line.strip().startswith("backend") and flag == "true" : flag = "false" continue if flag == "true" : list_addr.append(line) return list_addr #增加 def file_add(domain_name,list): flag = "false" result = '1' with open(file_name, "a+", encoding="utf-8") as f: for line in f: if line.strip() == "backend %s" % (domain_name): result = "0" #表示已经存在0 break if result != '0' : print("不存在添加") f.write("backend %s\n" %(domain_name)) for ip in list['server'] : f.write("\t\t server %s weight %s maxconn %s\n" %(ip,list['ip_weight'],list['ip_maxconn'])) result = '1' return result def file_change(domain_name,list): del_reustl = file_del(domain_name) if del_reustl == 0 : file_add(domain_name,list) print ("test") else : return 0 #删除 def file_del(domain_name): flag = "false" tmp_file_name="nginx.conf.bak" with open(file_name, "r", encoding="utf-8") as f1,\ open(tmp_file_name, "w", encoding="utf-8") as f2: for line in f1: if line.strip() == "backend %s" % (domain_name): flag = "true" continue if line.strip().startswith("backend") and flag == "true": flag = "false" f2.write(line) continue if flag == "false": f2.write(line) file_rename(file_name,tmp_file_name) return 0 def file_rename(old_name,new_name): date_format = "%Y%m%d" date_now = time.strftime(date_format) shutil.move(old_name,"nginx.conf.20180410.bak") shutil.move(new_name,old_name) while 1 : user_choice = input(''' 1、查询配置文件 2、增加配置文件内容 3、删除配置文件 4、修改配置文件 5、退出 ''') if user_choice == '1' : domain_name = input("请输入你要查询的域名:") serach_reustl = file_serach(domain_name) print("查询结果".center(50, '*')) if not serach_reustl : print("查询结果不存在,3s后返回首页面") time.sleep(3) continue for line in serach_reustl: print(line.strip()) continue elif user_choice == '2' : print('''增加配置文件内容, 例子:{"backend":"ttt.oldboy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":"3000"}}"''') #输入字符串 eval 转化为列表 domain_tite =input("backend:") ip_list = input("请输入IP,以,为分隔符").split(',') ip_weight = input("weight:") ip_maxconn = input("maxconn:") user_input_list = {'server':ip_list,'ip_weight':ip_weight,'ip_maxconn':ip_maxconn} add_result = file_add(domain_tite,user_input_list) if add_result == '0' : print("输入的域名已经存在,请重新输入") else : print("添加成功") elif user_choice == '3' : domain_name = input("请输入你要删除的域名:") del_result = file_del(domain_name) if del_result == 0 : print("删除成功",del_result) else : print("失败",del_result) elif user_choice == '4' : print('''修改配置文件内容, 例子:{"backend":"ttt.oldboy.org","record":{"server":"100.1.7.9","weight":"20","maxconn":"3000"}}"''') # domain_tite = input("backend:") ip_list = input("请输入修改后IP,以,为分隔符").split(',') ip_weight = input("weight:") ip_maxconn = input("maxconn:") user_input_list = {'server': ip_list, 'ip_weight': ip_weight, 'ip_maxconn': ip_maxconn} add_result = file_change(domain_tite, user_input_list) if add_result == '0' : print("更新域名不存在") else: print("更新成功") elif user_choice == '5': print("退出登录") exit() else : print("输入错误") continue
良禽择木而栖 贤臣择主而侍