首页 文章 精选 留言 我的

精选列表

搜索[AI编程],共10000篇文章
优秀的个人博客,低调大师

Python|19个优雅的Python编程技巧,涨姿势!

Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀的源代码值得阅读,比如:requests、flask、tornado,下面列举一些常见的Pythonic写法。 程序必须先让人读懂,然后才能让计算机执行。 “Programs must be written for people to read, and only incidentally for machines to execute.” 1、交换赋值 2、Unpacking 3、使用操作符in 4、字符串操作 5、字典键值列表 6、字典键值判断 7、字典 get 和 setdefault 方法 8、判断真伪 9、遍历列表以及索引 10、列表推导 11、列表推导-嵌套 12、循环嵌套 13、尽量使用生成器代替列表 小编推荐一个学Python的学习裙【 二二七,四三五,四五零 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!希望新手少走弯路 14、中间结果尽量使用imap/ifilter代替map/filter 15、使用any/all函数 16、属性(property) 17、使用 with 处理文件打开 18、使用 with 忽视异常(仅限Python 3) 19、使用 with 处理加锁 涨姿势了吗?

优秀的个人博客,低调大师

ABAP,Java, nodejs和go语言的web server编程

ABAP and Java see my blog). nodejs 用nodejs现成的express module,几行代码就能写个server出来: var express = require('express'); var routesEngine = require('./jerryapp/routes/index.js'); // index.js actually http://www.ruanyifeng.com/blog/2015/05/require.html var app = express(); app.use('/ui5', express.static(process.cwd() + '/webapp')); app.use('/v', express.static(process.cwd() + '/vue')); app.use('/map', express.static(process.cwd() + '/map')); app.use('/tile', express.static(process.cwd() + '/tileStudy')); app.use('/a2', express.static(process.cwd() + '/a2')); routesEngine(app); app.listen(process.env.PORT || 3000, function () { console.log('Listening on port, process.cwd(): ' + process.cwd() ); }); go 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

优秀的个人博客,低调大师

《Python编程:从入门到实践》 第8章习题

#8-1消息:编写一个名为display_message()的函数,它打印一个句子,指出你 #在本章学的是什么。调用这个函数,确认显示的消息正确无误。 def display_message(): print("你正在学的是第八章,函数。") display_message() #8-2 喜欢的图书:编写一个名为favorite_book()的函数,其中包含一个名为 #title的形参。这个函数打印一条消息,如One of my favorite books is #Alice in Wonderland。调用这个函数,并将一本图书的名称作为实参传递给它。 def favorite_book(title): print("One of my favorite books is " + title.title() + ".") favorite_book("calabash brothers") #8-3T恤:编写一个名为make_shirt()的函数,它接受一个尺码以及要印到T恤上 #的字样。这个函数应打印一个句子,概要地说明T恤的尺码和字样。 def make_shirt(size, logo): print("\nThe dress is in size " + str(size) + ".") print("The inscription on The t-shirt is" + logo.title()) make_shirt(25, 'The dog egg') make_shirt(logo = 'The cat egg', size = 26) #8-4大号T恤:修改函数make_shirt(),使其在默认情况下制作一件印有字样“I #lovePython”的大号T恤。调用这个函数来制作如下T恤:一件印有默认字样的大号T恤、 #一件印有默认字样的中号T恤和一件印有其他字样的T恤(尺码无关紧要)。 def make_shirt(size, logo = 'I love Python'): print("\nThe dress is in size " + str(size) + ".") print("The inscription on The t-shirt is" + logo.title()) make_shirt(size = 'x') make_shirt(size = 'l') make_shirt('l', logo = 'The dog egg') #8-5城市:编写一个名为describe_city()的函数,它接受一座城市的名字以及该城市所属的 #国家。这个函数应打印一个简单的句子,如Reykjavik is in Iceland。给用于存储国家 #的形参指定默认值。为三座不同的城市调用这个函数,且其中至少有一座城市不属于默认国家。 def describe_city(name, country = 'US'): print(name.title() + " is in " + country.title()) describe_city('washington') describe_city('chengdu', country = 'china') describe_city(name = 'paris', country = 'france') #8-6 城市名:编写一个名为city_country()的函数,它接受城市的名称及其所属的 #国家。这个函数应返回一个格式类似于下面这样的字符串:"Santiago, Chile" def city_country(name, country): full_name = name + ' ' + country return full_name.title() location = city_country('beijing', 'chine') print(location) location = city_country('Gibraltar', 'england') print(location) location = city_country('copenhagen', 'Denmark') print(location) #8-7专辑:编写一个名为make_album()的函数,它创建一个描述音乐专辑的字典。这个函数 #应接受歌手的名字和专辑名,并返回一个包含这两项信息的字典。使用这个函数创建三个表示 #不同专辑的字典,并打印每个返回的值,以核实字典正确地存储了专辑的信息。 def make_album(singerName, albumName, songsNumber = ''): if songsNumber: summarize = { 'name':singerName, 'album':albumName, 'number':songsNumber } else: summarize = {'name':singerName, 'album':albumName} return summarize albumSummarize = make_album('Nicolas Errera', 'The Butterfly') print(albumSummarize) albumSummarize = make_album('muse', 'Unintended',12) print(albumSummarize) albumSummarize = make_album('The Beatles', 'Hey Jude',9) print(albumSummarize) #8-8用户的专辑:在为完成练习8-7编写的程序中,编写一个while循环,让用户输 #入一个专辑的歌手和名称。获取这些信息后,使用它们来调用函数make_album(), #并将创建的字典打印出来。在这个while循环中,务必要提供退出途径. def make_album(singerName, albumName, songsNumber = ''): if songsNumber: summarize = { 'name':singerName, 'album':albumName, 'numbers':songsNumber } else: summarize = {'name':singerName, 'album':albumName} return summarize while True: singer = input("输入歌手名字(输入'q'即可退出)") if singer == 'q': break album = input("输入专辑名字(输入'q'即可退出)") if album == 'q': break number = input("输入歌曲数量(输入'q'即可退出)") if number == 'q': break albumSummarize = make_album(singer, album, number) print(albumSummarize) #8-9魔术师:创建一个包含魔术师名字的列表,并将其传递给一个名 #为show_magicians()的函数,这个函数打印列表中每个魔术师的名字。 def shou_magicians(names): for name in names: print(name) magicians = ['wwz','zzq','llo'] shou_magicians(magicians) #8-10了不起的魔术师:在你为完成练习8-9而编写的程序中,编写一个名 #为make_great()的函数,对魔术师列表进行修改,在每个魔术师的名字中都加入 #字样“theGreat”。调用函数show_magicians(),确认魔术师列表确实变了。 def make_great(names, roll): while names: name = names.pop() print(name + ' the great.') roll.append(name) magicians_names = ['wwz','zzq','llo'] roll_names = [] make_great(magicians_names, roll_names) print(magicians_names) print(roll_names) #8-12 三明治:编写一个函数,它接受顾客要在三明治中添加的一系列食材。这个函数只 #有一个形参(它收集函数调用中提供的所有食材),并打印一条消息,对顾客点的三明治 #进行概述。调用这个函数三次,每次都提供不同数量的实参。 def add_ingredients(ingredients): print('The side dish you add to your sandwich is ' + ingredients.title()) add_ingredients('egg') add_ingredients('beef') add_ingredients('cheese') #8-13 用户简介:复制前面的程序user_profile.py,在其中调用build_profile()来 #创建 有关你的简介;调用这个函数时,指定你的名和姓,以及三个描述你的键-值对。 def build_profile(first, last, **user_info): """创建一个字典,其中包含我们知道的有关用户的一切""" profile = {} profile['first_name'] = first profile['last_name'] = last for key, value in user_info.items(): profile[key] = value return profile user_profile = build_profile('w', 'zc', location='guangyuan', field='game', gender='man') print(user_profile) #8-14 汽车:编写一个函数,将一辆汽车的信息存储在一个字典中。这个函数总是接受制造 #商和型号,还接受任意数量的关键字实参。这样调用这个函数:提供必不可少的信息,以及 #两个名称—值对,如颜色和选装配件。这个函数必须能够像下面这样进行调用: def make_car(manufacturer, model, **number): profile = {} profile['制造商'] = manufacturer profile['型号'] = model for key, value in number.items(): profile[key] = value return profile car = make_car( '宝马', '越野', 颜色='银色', 配置='中配', 安全性='优', 舒适性='5星', ) print(car) #8-15 打印模型:将示例print_models py中的函数放在另一个名为printing_functions.py #的文件中;在print_models.py的开头编写一条import语句,并修改这个文件以使用导入的函数。 ''' # printing_functions.py中的代码 def print_models(unprinted_designs, completed_models): """ 模拟打印每个设计,直到没有未打印的设计为止 打印每个设计后,都将其移到列表completed_models中 """ while unprinted_designs: current_design = unprinted_designs.pop() # 模拟根据设计制作3D打印模型的过程 print("Printing model: " + current_design) completed_models.append(current_design) def show_completed_models(completed_models): """显示打印好的所有模型""" print("\nThe following models have been printed:") for completed_model in completed_models: print(completed_model)''' import printing_functions as spam unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron'] completed_models = [] spam.print_models(unprinted_designs, completed_models) spam.show_completed_models(completed_models) #8-16 略 #8-17 略

优秀的个人博客,低调大师

《Python编程:从入门到实践》 第7章习题

#7-1汽车租赁:编写一个程序,询问用户要租赁什么样的汽车,并打印一条消息, #如“LetmeseeifIcanfindyouaSubaru”。 car = input() print("Let me see if I can find you a" + car + ".") #7-2 餐馆订位:编写一个程序,询问用户有多少人用餐。如果超过8人,就打印一条消息, #指出没有空桌;否则指出有空桌。 message = int(input("请问您们用餐的有几位?")) if message > 8: print("抱歉,8个位置以上的位置没有空余的了。") elif message <= 0: print("就餐人数不能少于一个人。") else: print("您好,还有位置。") #7-3 10的整数倍:让用户输入一个数字,并指出这个数字是否是10的整数倍。 number = int(input("输入一个数字,我会告诉您,这个数字是否是10的倍数")) if number%10 == 0: print("太棒了!您输入的数字是" + str(number) + ",它是10的倍数。") else: print("真遗憾!您输入的数字是" + str(number) + ",它不是10的倍数。") #7-4比萨配料:编写一个循环,提示用户输入一系列的比萨配料,并在用户输入'quit'时 #结束循环。每当用户输入一种配料后,都打印一条消息,说我们会在比萨中添加这种配料 while True: x = input("请添加披萨的配菜!(输入“quit”退出)") if x != 'quit': print("已为您披萨添加:" + x + "。") else: break #7-5电影票:有家电影院根据观众的年龄收取不同的票价:不到3岁的观众免费;3~12岁的 #观众为10美元;超过12岁的观众为15美元。请编写一个循环,在其中询问用户的年龄, #并指出其票价 age = '' active = True while age != 'qiut': age = input("您好,请问您的年龄是多少?") if age == 'qiut': active = False elif int(age) < 0: print("你不是人,请回你的火星去。") elif int(age) < 3: print("您好,您免费哦!") elif int(age) <= 12: print("您好,收费金额为:10元") elif int(age) > 12: print("您好,收费金额为:15元") #7-6三个出口 : 以另一种方式完成练习7-4或练习7-5, 在程序中采取如下所有做法。 age = '' while True: age = input("您好,请问您的年龄是多少?") if age == 'qiut': print("qiut") break elif int(age) < 0: print("你不是人,请回你的火星去。") elif int(age) < 3: print("您好,您免费哦!") elif int(age) <= 12: print("您好,收费金额为:10元") elif int(age) > 12: print("您好,收费金额为:15元") #7-7无限循环:编写一个没完没了的循环,并运行它(要结束该循环,可按Ctrl+C #,也可关闭显示输出的窗口) while True: print("good") #7-8熟食店:创建一个名为sandwich_orders的列表,在其中包含各种三明治的名字;再 #创建一个名为finished_sandwiches的空列表。遍历列表sandwich_orders,对于其中 #的每种三明治,都打印一条消息,如I made your tuna sandwich ,并将其移到列表 #finished_sandwiches。所有三明治都制作好后,打印一条消息,将这些三明治列出来。 sandwich_orders = ['tuna','Cheese','chicken'] finished_sandwiches = [] while sandwich_orders: sandwich = sandwich_orders.pop() print("I made your " + sandwich + "sandwich.") finished_sandwiches.append(sandwich) print("Print out all the sandwiches") #打印出所有三明治。 for sandwich in finished_sandwiches: print(sandwich + "sandwich.") #7-9五香烟熏牛肉(pastrami)卖完了:使用为完成练习7-8而创建的列表sandwich_orders, #并确保'pastrami'在其中至少出现了三次。在程序开头附近添加这样的代码:打印一条消息, #指出熟食店的五香烟熏牛肉卖完了;再使用一个while循环将列表sandwich_orders中的 #'pastrami'都删除。确认最终的列表finished_sandwiches中不包含'pastrami' sandwich_orders = [ 'tuna', 'pastrami', 'chicken', 'pastrami', 'durian', 'pastrami', 'Cheese' ] finished_sandwiches = [] print("Sorry, we're out of pastrami") while sandwich_orders: sandwich = sandwich_orders.pop() if sandwich == 'pastrami': #比7-8多了这两段 continue print("I made your " + sandwich + " sandwich.") finished_sandwiches.append(sandwich) print("Print out all the sandwiches") #打印出所有三明治。 for sandwich in finished_sandwiches: print(sandwich + " sandwich.") #7-10梦想的度假胜地:编写一个程序,调查用户梦想的度假胜地。使用类似于“If you could #visit one place in the world,where would you go?”的提示,并编写一个打印 #调查结果的代码块。 namesCitys = {} verdict = True while verdict: name = input("您好,您叫什么名字?(输入'qiut即结束')") if name == 'qiut': break citys = input("如果你能去到世界上的一个地方,你会去哪里(输入'qiut即结束')") if citys == 'qiut': break namesCitys[name] = citys print(namesCitys)

优秀的个人博客,低调大师

《Python编程:从入门到实践》 第5章习题

#5-1 条件测试:编写一系列条件测试;将每个测试以及你对其结果的预测和实际结果 #都打印出来。你编写的代码应类似于下面这样: car = 'subaru' print("Is car == 'subaru'? I predict True.") print(car == 'subaru') print("\nIs car == 'audi'? I predict False.") print(car == 'audi' + "\n") #5-2 更多的条件测试:你并非只能创建10个测试。如果你想尝试做更多的比较,可再编写 #一些测试,并将它们加入到conditional_tests.py中。对于下面列出的各种测试,至少编写 #一个结果为True和False的测试。 #略 #5-3 外星人颜色#1:假设在游戏中刚射杀了一个外星人,请创建一个名为alien_color #的变量,并将其设置为'green'、'yellow'或'red'。 alien_color = 'green' if alien_color == 'green': score = 5 if alien_color == 'red': score = 10 print('你击毁了外星人飞船,获得了 ' + str(score) + '分!') #5-4 外星人颜色#2:像练习5-3那样设置外星人的颜色,并编写一个if-else结构。 alien_color = 'green' if alien_color == 'green': score = 5 else: score = 10 print('你击毁了外星人飞船,获得了 ' + str(score) + '分!') #5-5 外星人颜色#3:将练习5-4中的if-else结构改为if-elif-else结构。 #alien_color = 'green' alien_color = 'yellow' #alien_color = 'red' if alien_color == 'green': score = 5 elif alien_color == 'yellow': score = 10 elif alien_color == 'red': score = 15 else: print('未知') print('你击毁了外星人飞船,获得了 ' + str(score) + '分!') #5-6人生的不同阶段:设置变量age的值,再编写一个if-elif-else结构,根据age #的值判断处于人生的哪个阶段。 age = 5 if age < 2: message = '婴儿' elif age < 4: message = '正在学步' elif age < 13: message = '儿童' elif age < 20: message = '青年' elif age < 65: message = '成年' else: message = '老年' print("他现在是" + message + "了。") #5-7 喜欢的水果:创建一个列表,其中包含你喜欢的水果,再编写一系列独立的if语 #句,检查列表中是否包含特定的水果。 favorite_fruits = ['apple','litchi','watermelon'] watermelon = 'watermelon' if 'bananas' in favorite_fruits: print("You really like bananas!") if 'orange' in favorite_fruits: print("You really like orange!") if 'pear' in favorite_fruits: print("You really like pear!") if 'apple' in favorite_fruits: print("You really like apple!") if 'watermelon' in favorite_fruits: print("You really like watermelon!") #5-8 以特殊方式跟管理员打招呼:创建一个至少包含5个用户名的列表,且其中一个用 #户名为'admin'。想象你要编写代码,在每位用户登录网站后都打印一条问候消息。遍 #历用户名列表,并向每位用户打印一条问候消息。 names = ['zi52','wwwww','zzia','admin','ookkl'] for name in names: if name =='admin': print("您好," + name.title() + ",您想查看今天的数据吗?") else: print("您好," + name.title() + ",欢迎登陆!") #5-9 处理没有用户的情形:在为完成练习5-8编写的程序中,添加一条if语句,检查用 #户名列表是否为空。 names = [] if names : for name in names: if name =='admin': print("您好," + name.title() + ",您想查看今天的数据吗?") else: print("您好," + name.title() + ",欢迎登陆!") else: print("我们需要一些用户") #5-10 检查用户名:按下面的说明编写一个程序,模拟网站确保每位用户的用户名都独一无 #二的方式。 current_users = ['Zi52','wwwww','Zzia','admin','ookkl'] new_users = ['jjjll','zi52','kkkij','zzia','oooxxx'] for new in new_users: if new.lower() in [current_user.lower() for current_user in current_users]: print(new + "此用户名已经被占用,请重新输入!") else: print(new + "此用户名可以使用。") #5-11 序数:序数表示位置,如1st和2nd。大多数序数都以th结尾,只有1、2和3例外。 #在一个列表中存储数字1~9。 num = list(range(1,10)) for nu in num: if nu == 1: print(str(nu) + 'st') elif nu == 2: print(str(nu) + 'nt') elif nu == 3: print(str(nu) + 'rt') else: print(str(nu) + 'tt')

优秀的个人博客,低调大师

《Python编程:从入门到实践》 第4章习题

#4-1比萨:想出至少三种你喜欢的比萨,将其名称存储在一个列表中, #再使用for循环将每种比萨的名称都打印出来。 pizza_toppings =['Durian','Bacon','Shrimp'] for toppings in pizza_toppings: print("I like " + toppings.title() + " pizza.") print("I really love pizza!") #4-2 动物: 想出至少三种有共同特征的动物,将这些动物的名称存储在一个列表中, #再使用for循环将每种动物的名称都打印出来。 zoologys = ['cat','dog','pig'] for zoology in zoologys: print("A" + zoology.title() + "would make a great pet.") print("Any ofthese animals would make a great pet!") #4-3 数到20:使用一个for循环打印数字1~20(含)。 for number in range(1,21): print(number) #4-4 一百万:创建一个列表,其中包含数字1~1 000 000,再使用一个for循环 #将这些数字打印出来(如果输出的时间太长,按Ctrl + C停止输出,或关闭输出窗口)。 millions = list(range(1,1000001)) for million in millions: print(million) #4-5 计算1~1000000的总和:创建一个列表,其中包含数字1~1 000 000,再使用min()和 #max()核实该列表确实是从1开始,到1000000结束的。另外,对这个列表调用函数sum(), #看看Python将一百万个数字相加需要多长时间。 millions = list(range(1,1000001)) print(min(millions)) print(max(millions)) print(sum(millions)) #4-6 奇数:通过给函数range()指定第三个参数来创建一个列表,其中包含1~20的奇数; #再使用一个for循环将这些数字都打印出来。 odd_number = list(range(1,20,2)) for number in odd_number: print(number) #4-7 3的倍数:创建一个列表,其中包含3~30内能被3整除的数字; #再使用一个for循环将这个列表中的数字都打印出来。 triples = list(range(3,31,3)) for triple in triples: print(triple) #4-8 立方:将同一个数字乘三次称为立方。例如,在Python中,2的立方用2**3表示。请创建 #一个列表,其中包含前10个整数(即1~10)的立方,再使用一个for循环将这些立方数都打印出来。 cube = [] for num in range(1,11): cube.append(num**3) print(cube) #4-9 立方解析 : 使用列表解析生成一个列表, 其中包含前10个整数的立方。 cubes = [num**3 for num in range(1,11)] print(cubes) #4-10 切片:选择你在本章编写的一个程序,在末尾添加几行代码,以完成如下任务。 zoologys = ['cat','dog','pig','cow','panda'] print("The first three items in the list are:") print(zoologys[0:3]) print("Three items from the middle of the list are:") print(zoologys[1:4]) print("The last three items in the list are:") print(zoologys[-3:]) #4-11 你的比萨和我的比萨:在你为完成练习4-1而编写的程序中,创建比萨列表的副本, #并将其存储到变量friend_pizzas中,再完成如下任务。,'lobster','mushroom' pizza_toppings =['Durian','Bacon','Shrimp'] friend_pizzas = pizza_toppings[:] pizza_toppings.append('mushroom') friend_pizzas.append('lobster') print("My favorite pizzas are:") print(pizza_toppings) print("My friend's favorite pizzas are:") print(friend_pizzas) #4-12 使用多个循环:在本节中,为节省篇幅,程序foods.py的每个版本都没有使用for循环 #来打印列表。请选择一个版本的foods.py,在其中编写两个for循环,将各个食品列表都 #打印出来。 my_foods = ['pizza', 'falafel', 'carrot cake'] for my_food in my_foods: print(my_food) #4-13 自助餐:有一家自助式餐馆,只提供五种简单的食品。请想出五种简单的食品, #并将其存储在一个元组中。 buffet = ('beef','fish','chicken','salad','dessert') for food in buffet: print(food) buffet[2] = 'lobster' buffet = ('beef','salmon','MuttonShashlik','salad','dessert') for food_2 in buffet: print(food_2)

优秀的个人博客,低调大师

《Python编程:从入门到实践》 第3章习题

#3-1 姓名: 将一些朋友的姓名存储在一个列表中, 并将其命名为names。 #依次访问该列表中的每个元素, 从而将每个朋友的姓名都打印出来。 names = ['mengxiang','lindan','zhaodianyan','fanpeng'] for name in names: print(name) #3-2 问候语: 继续使用练习3-1中的列表,但不打印每个朋友的姓名, #而为每人打印一条消息。 每条消息都包含相同的问候语, 但抬头为相应朋友的姓名。 names = ['mengxiang','lindan','zhaodianyan','fanpeng'] for name in names: print(name) print("Hello! Have you studied today?") #3-3自己的列表: 想想你喜欢的通勤方式, 如骑摩托车或开汽车, 并创建一个包含多种通勤 #方 式的列表。 根据该列表打印一系列有关这些通勤方式的宣言, 如“Iwould like toowna #Honda motorcycle”。 commutings = ['bike','bus','car'] for commuting in commutings: print("I travel by" + commuting + "!") #3-4嘉宾名单: 如果你可以邀请任何人一起共进晚餐(无论是在世的还是故去的),你会邀 #请哪些人? 请创建一个列表,其中包含至少3个你想邀请的人;然后,使用这个列表打印消 #息,邀请这些人来与你共进晚餐。 names = ['wwz','fp','tq'] for name in names: print(name.title() + ",中午咱们去搓一顿,我请客!") #3-5 修改嘉宾名单 : 你刚得知有位嘉宾无法赴约, 因此需要另外邀请一位嘉宾。 names = ['wwz','fp','tq'] pop_names = names.pop(2) print(pop_names.title() + "不能来参加聚会了。") names.insert(2,'wg') for name in names: print(name.title() + ",中午咱们去搓一顿,我请客!") #3-6 添加嘉宾:你刚找到了一个更大的餐桌,可容纳更多的嘉宾。请想想你还想邀请哪三 #位嘉宾。 names = ['wwz','fp','tq'] names.insert(0,'wm') names.insert(2,'zdy') names.append('jg') for name in names: print(name.title() + ",中午咱们去搓一顿,我请客!") #3-7缩减名单:你刚得知新购买的餐桌无法及时送达,因此只能邀请两位嘉宾。 names = ['wwz','fp','tq'] names.insert(0,'wm') names.insert(2,'zdy') names.append('jg') print("我曹,对不住了兄弟!今只能请两个人搓了,地小装不下。") for x in range(0,4): pop_namesr = names.pop(-1) print(pop_namesr + ",兄弟我这里给你赔不是,下次单独请你!") for name in names: print(name.title() + ",中午咱们去搓一顿,我请客!") del names[0] del names[0] print(names) #3-8 放眼世界:想出至少5个你渴望去旅游的地方。 countrys = ['Netherlands','Switzerland','Germany','England','Greece'] print(countrys) print(sorted(countrys)) print(countrys) print(sorted(countrys,reverse=True)) print(countrys) countrys.reverse() print(countrys) countrys.reverse() print(countrys) countrys.sort() print(countrys) countrys.sort(reverse=True) print(countrys) #3-9 晚餐嘉宾:在完成练习3-4~练习3-7时编写的程序之一中, #使用len()打印一条消息,指出你邀请了多少位嘉宾来与你共进晚餐。 names = ['wwz','fp','tq'] print(len(names)) #3-10 尝试使用各个函数:想想可存储到列表中的东西,如山岳、河流、国家、城市、语言或 #你喜欢的任何东西。编写一个程序,在其中创建一个包含这些元素的列表,然后,对于本章 #介绍的每个函数,都至少使用一次来处理这个列表。 #略 #3-11有意引发错误:如果你还没有在程序中遇到过索引错误,就尝试引发一个这种错误。 #在你的一个程序中,修改其中的索引,以引发索引错误。关闭程序前,务必消除这个错误。 lens = ['a','b','c','d'] print(lens[4])

优秀的个人博客,低调大师

Java高阶编程——RxBus 开源,基于 RxJava 的 event bus

介绍 RxBus 是一个发布/订阅模式的事件总线,用法和 EventBus 一样简单。RxBus 基于 RxJava 开发,除了拥有和 EventBus 一样简单的事件总线机制之外,还拥有 RxJava 的丰富特性。 如何使用 定义 EventData: public static class EventData { /* Additional fields if needed */ } 注解定义订阅者的回调方法,回调方法回在 UI 线程中执行: @RegisterBus public void onMessageEvent(MessageEvent event) {/* Do something */}; 注册/解注册。 观察者需要被注册到 RxBus,其 @RegisterBus 标记的方法才会被扫描到,在不需要的地方记得解注册。 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); // register to RxBus RxBus.getInstance().register(this); } @Override protected void onDestroy() { super.onDestroy(); // unregister from RxBus RxBus.getInstance().unRegister(this); } 发送数据: // send data in thread Data data = new Data(); Data.setContent("hello world"); RxBus.getInstance().send(data); 比 EventBus 多的优点 RxBus 提供 chainProcess 方法来包装一个处理过程, 处理结果会自动发送到观察者。 在 MVP 架构的 M 层你可以这样用 RxBus.getInstance().chainProcess(new Func1() { @Override public Object call(Object o) { // do something in IO thread, the return data can be subscribe and receive. // getUser() is a IO/net process User user = getUser(); user.setId(uid); user.setName("大利猫"); return user; } }); 然后在 P 层接收: /** * @RegisterBus mark this method to receive data in UI thread * @param user */ @RegisterBus public void onUser(User user) { userView.showUser(user); } Gradle independence Step 1. Add the JitPack repository to your build file, Add it in your root build.gradle at the end of repositories: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } Step 2. Add the dependency dependencies { compile 'com.github.liuguangli:RxBus:1.1' } 欢迎加入Java高级架构学习交流群:468947140 进群获取架构资料 还有在大型企业工作十余年的架构师分享经验,Java工程化管理、高性能、分布式、高可用架构、zookeeper、Spring cloud,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货 进群修改群备注:开发年限-地区-经验 点击链接加入群聊【Java-BATJ企业级资深架构】:https://jq.qq.com/?_wv=1027&k=52j2FVO 源码地址 https://github.com/liuguangli/RxBus

优秀的个人博客,低调大师

《Python编程:从入门到实践》 第2章习题

#2-1 简单消息:将一条消息储存到变量中,再将其打印出来。 message = 'Hi, I am a happy Coder' print(message) #2-2 多条简单消息: 将一条消息存储到变量中, 将其打印出来; 再将变量的值修改为一条新消息, 并将其打印出来。 message = 'I am coming' print(message) #2-3个性化消息: 将用户的姓名存到一个变量中, 并向该用户显示一条消息。 显示的消息 应非常简单, 如“ Hello Eric, would you like to learn some Python today?” 。 name = 'WWZ' print("Hello " + name.title() + " would you like to learn some Python today?" ) #2-4 调整名字的大小写: 将一个人名存储到一个变量中, 再以小写、 大写和首字母大写的 方式显示这个人名。 name = 'WWZ' print(name.lower()) print(name.upper()) print(name.title()) #2-5 名言: 找一句你钦佩的名人说的名言, 将这个名人的姓名和他的名言打印出来。 输出应类似于下面这样(包括引号) : print("孔子曾说过,“学而不思则罔,思而不学则殆。”") #2-6 名言2: 重复练习2-5, 但将名人的姓名存储在变量famous_person中, 再创建要显示的消息, 并将其存储在变量message中, 然后打印这条消息。 famous_person = "孔子" message = "“学而不思则罔,思而不学则殆。”" print(famous_person + "曾说过," + message) #2-7 剔除人名中的空白: 存储一个人名,并在其开头和末尾都包含一些空白字符。 务必至少使用字符组合"\t"和"\n"各一次。 name = " \t WWZ " name2 = " \n WWZ " print(name.lstrip()) print(name.rstrip()) print(name.strip()) print(name2.lstrip()) print(name2.rstrip()) print(name2.strip()) #2-8 数字8: 编写4个表达式, 它们分别使用加法、 减法、 乘法和除法运算, 但结果都是数字 8。 为使用print语句来显示结果, 务必将这些表达式用括号括起来, 也就是说, 你应该 编写4行类似于下面的代码: print(2+6) print(10-2) print(2*4) print(16/2) #2-9 最喜欢的数字: 将你最喜欢的数字存储在一个变量中, 再使用这个变量创建一条消息,指出你最喜欢的数字, 然后将这条消息打印出来。 number = 1 message = "My favorite number is," print(message + str(number)) #2-10添加注释: 选择你编写的两个程序, 在每个程序中都至少添加一条注释。 如果程序太简单, 实在没有什么需要说明的, 就在程序文件开头加上你的姓名和当前日期, 再用一句话阐述程序的功能。 number = 1 #喜欢的数字 message = "My favorite number is," #阐述消息 print(message + str(number)) #2-11 Python之禅: 在Python终端会话中执行命令import this, 并粗略地浏览一下其他的指导原则。 import this

优秀的个人博客,低调大师

Java编程详解-基于 dubbo 的分布式架构

前言 现在越来越多的互联网公司还是将自己公司的项目进行服务化,这确实是今后项目开发的一个趋势,就这个点再凭借之前的SSM项目来让第一次接触的同学能快速上手。 浅谈分布式架构 分布式架构 单看这个名字给人的感觉就是高逼格,但其实从历史的角度来分析一下就比较明了了。 我们拿一个电商系统来说: 单系统 对于一个刚起步的创业公司项目肯定是追求越快完成功能越好,并且用户量也不大。 这时候所有的业务逻辑都是在一个项目中就可以满足。 垂直拆分-多应用 当业务量和用户量发展到一定地步的时候,这时一般会将应用同时部署到几台服务器上,在用户访问的时候使用 Nginx 进行反向代理和简单的负载均衡。 SOA服务化 当整个系统以及发展的足够大的时候,比如一个电商系统中存在有: 用户系统 订单系统 支付系统 物流系统 等系统。 如果每次修改了其中一个系统就要重新发布上线的话那么耦合就太严重了。 所以需要将整个项目拆分成若干个独立的应用,可以进行独立的开发上线实现快速迭代。 如上图所示每个应用之间相互独立,每个应用可以消费其他应用暴露出来的服务,同时也对外提供服务。 从架构的层面简单的理解了,接下来看看如何编码实现。 基于dubbo的实现 dubbo 应该算是国内使用最多的分布式服务框架,基于此来实现对新入门的同学应该很有帮助。 其中有涉及到安装dubbo服务的注册中心zookeeper等相关知识点可以自行查看官方文档,这里就不单独讲了。 对外提供服务 首先第一步需要在 SSM-API 模块中定义一个接口,这里就搞了一个用户查询的接口 /** * Function:用户API *@authorchenjiec * Date: 2017/4/4 下午9:46 *@sinceJDK 1.7 */ publicinterfaceUserInfoApi{ /** * 获取用户信息 *@paramuserId *@return *@throwsException */ publicUserInfoRsp getUserInfo(int userId) throwsException; } 接着在 SSM-SERVICE 模块中进行实现: importcom.alibaba.dubbo.config.annotation.Service; /** * Function: *@authorchenjiec * Date: 2017/4/4 下午9:51 *@sinceJDK 1.7 */ @Service publicclassUserInfoApiImplimplementsUserInfoApi{ privatestaticLogger logger = LoggerFactory.getLogger(UserInfoApiImpl.class); @Autowired privateT_userService t_userService ; /** * 获取用户信息 * *@paramuserId *@return *@throwsException */ @Override publicUserInfoRspgetUserInfo(intuserId)throwsException { logger.info("用户查询Id="+userId); //返回对象 UserInfoRsp userInfoRsp =newUserInfoRsp() ; T_user t_user = t_userService.selectByPrimaryKey(userId) ; //构建 buildUserInfoRsp(userInfoRsp,t_user) ; returnuserInfoRsp; } /** * 构建返回 *@paramuserInfoRsp *@paramt_user */ privatevoidbuildUserInfoRsp(UserInfoRsp userInfoRsp, T_user t_user) { if(t_user ==null){ t_user =newT_user() ; } CommonUtil.setLogValueModelToModel(t_user,userInfoRsp); } } 这些都是通用的代码,但值得注意的一点是这里使用的 dubbo 框架所提供的 @service 注解。作用是声明需要暴露的服务接口。 再之后就是几个dubbo相关的配置文件了。 spring-dubbo-config.xml <dubbo:applicationname="ssm-service" owner="crossoverJie" organization="ssm-crossoverJie" logger="slf4j"/> <dubbo:registryid="dubbo-registry" address="zookeeper://192.168.0.188:2181" file="/tmp/dubbo.cachr" /> <dubbo:monitorprotocol="registry" /> <dubbo:protocolname="dubbo" port="20880" /> <dubbo:providertimeout="15000" retries="0" delay="-1" /> <dubbo:consumercheck="false" timeout="15000" /> 其实就是配置我们服务注册的zk地址,以及服务名称、超时时间等配置。 spring-dubbo-provider.xml <dubbo:annotationpackage="com.crossoverJie.api.impl" /> 这个配置扫描注解包的位置,一般配置到接口实现包即可。 spring-dubbo-consumer.xml 这个是消费者配置项,表明我们需要依赖的其他应用。 这里我们在 SSM-BOOT 项目中进行配置: <dubbo:reference id="userInfoApi" interface="com.crossoverJie.api.UserInfoApi" /> 直接就是配置的刚才我们提供的那个用户查询的接口,这样当我们自己的内部项目需要使用到这个服务只需要依赖 SSM-BOOT 即可,不需要单独的再去配置 consumer 。这个我有在上一篇SSM(十) 项目重构-互联网项目的Maven结构中也有提到。 安装管理控制台 还有一个需要做的就是安装管理控制台,这里可以看到我们有多少服务、调用情况是怎么样等作用。 这里我们可以将dubbo的官方源码下载下来,对其中的 dubbo-admin 模块进行打包,将生成的 WAR包 放到 Tomcat 中运行起来即可。 但是需要注意一点的是: 需要将其中的 dubbo.properties 的zk地址修改为自己的即可。 dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.admin.root.password=root dubbo.admin.guest.password=guest 到时候登陆的话使用root,密码也是root。 使用guest,密码也是guest。 登陆界面如下图: 其中我们可以看到有两个服务以及注册上去了,但是没有消费者。 消费服务 为了能够更直观的体验到消费服务,我新建了一个项目: https://github.com/crossoverJie/SSM-CONSUMER。 其中在 SSM-CONSUMER-API 中我也定义了一个接口: /** * Function:薪资API *@authorchenjiec * Date: 2017/4/4 下午9:46 *@sinceJDK 1.7 */ publicinterfaceSalaryInfoApi{ /** * 获取薪资 *@paramuserId *@return *@throwsException */ publicSalaryInfoRsp getSalaryInfo(int userId) throwsException; } 因为作为消费者的同时我们也对外提供了一个获取薪资的一个服务。 在 SSM-CONSUMER-SERVICE 模块中进行了实现: /** * Function: *@authorchenjiec * Date: 2017/4/4 下午9:51 *@sinceJDK 1.7 */ @Service publicclassSalaryInfoApiImplimplementsSalaryInfoApi{ privatestaticLogger logger = LoggerFactory.getLogger(SalaryInfoApiImpl.class); @Autowired UserInfoApi userInfoApi ; /** * 获取用户信息 * *@paramuserId *@return *@throwsException */ @Override publicSalaryInfoRspgetSalaryInfo(intuserId)throwsException { logger.info("薪资查询Id="+userId); //返回对象 SalaryInfoRsp salaryInfoRsp =newSalaryInfoRsp() ; //调用远程服务 UserInfoRsp userInfo = userInfoApi.getUserInfo(userId); salaryInfoRsp.setUsername(userInfo.getUserName()); returnsalaryInfoRsp; } } 其中就可以直接使用 userInfoApi 调用之前的个人信息服务。 再调用之前需要注意的有点是,我们只需要依赖 SSM-BOOT 这个模块即可进行调用,因为 SSM-BOOT 模块已经为我们配置了消费者之类的操作了: <dependency> <groupId>com.crossoverJie</groupId> <artifactId>SSM-BOOT</artifactId> </dependency> 还有一点是在配置 SSM-BOOT 中的 spring-dubbo-cosumer.xml 配置文件的时候,路径要和我们初始化spring配置文件时的路径一致: <!-- Spring和mybatis的配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/*.xml</param-value> </context-param> 接下来跑个单测试一下能否调通: /** * Function: * *@authorchenjiec * Date: 2017/4/5 下午10:41 *@sinceJDK 1.7 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath*:/spring/*.xml" }) publicclassSalaryInfoApiImplTest{ @Autowired privateSalaryInfoApi salaryInfoApi ; @Test publicvoid getSalaryInfo() throws Exception { SalaryInfoRsp salaryInfo = salaryInfoApi.getSalaryInfo(1); System.out.println(JSON.toJSONString(salaryInfo)); } } 消费者 提供者 可以看到确实是调用成功了的。 接下来将消费者项目也同时启动在来观察管理控制台有什么不一样: 会看到多了一个消费者所提供的服务 com.crossoverjie.consumer.api.SalaryInfoApi ,同时 com.crossoverJie.api.UserInfoApi 服务已经正常,说明已经有消费者了。 点进去便可查看具体的消费者。 总结 这样一个基于dubbo的分布式服务已经讲的差不多了,在实际的开发中我们便会开发一个大系统中的某一个子应用,这样就算一个子应用出问题了也不会影响到整个大的项目。 再提一点: 在实际的生产环境一般同一个服务我们都会有一个 master , slave 的主从服务,这样在上线的过程中不至于整个应用出现无法使用的尴尬情况。 谈到了 SOA 的好处,那么自然也有相对于传统模式的不方便之处:

优秀的个人博客,低调大师

Java编程解密-Dubbo负载均衡与集群容错机制

1 Dubbo简介 Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。 作为一个轻量级RPC框架,Dubbo的设计架构简洁清晰,主要组件包括Provider(服务提供者),Consumer(服务消费者),Registry(注册中心)三部分组成。此外还有用于服务监控的Monitor,它们之间的关系如下所示: 在一个分布式系统中,为了做到系统的高可用,即服务宕机时不影响对外正常提供服务,需要组建负载集群,当集群中某一节点没有及时返回数据时,需要有集群容错(重试)机制。 2 Dubbo负载均衡 在集群负载均衡时,Dubbo 提供了以下5种均衡策略,缺省为 random 随机调用。 Random 随机调用 Random LoadBalance 随机,按权重设置随机概率。 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。 RoundRobin LoadBalance 轮循,按公约后的权重设置轮循比率。 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。 LeastActive LoadBalance 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。 ConsistentHash LoadBalance 一致性 Hash,相同参数的请求总是发到同一提供者。 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。 3 负载均衡配置 服务端服务级别 <dubbo:serviceinterface="..." loadbalance="roundrobin" />; 客户端服务级别 <dubbo:referenceinterface="..." loadbalance="roundrobin" /> 服务端方法级别 <dubbo:serviceinterface="..."> <dubbo:methodname="..." loadbalance="roundrobin"/> </dubbo:service> 客户端方法级别 <dubbo:referenceinterface="..."> <dubbo:methodname="..." loadbalance="roundrobin"/> </dubbo:reference> 4 Dubbo集群容错(重试机制) 在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 Failover 重试。 各节点关系: 这里的 Invoker 是 Provider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址及 Service 接口信息 Directory 代表多个 Invoker,可以把它看成 List ,但与 List 不同的是,它的值可能是动态变化的,比如注册中心推送变更 Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个 Router 负责从多个 Invoker 中按路由规则选出子集,比如读写分离,应用隔离等 LoadBalance 负责从多个 Invoker 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选 5 重试模式及其特点 Failover Cluster(默认) 失败自动切换,当出现失败,重试其它服务器 [1]。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。 重试次数配置如下: <dubbo:serviceretries="2" /> 或 <dubbo:referenceretries="2" /> 或 <dubbo:reference> <dubbo:methodname="findFoo" retries="2" /> </dubbo:reference> Failfast Cluster 快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。 Failsafe Cluster 失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。 Failback Cluster 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。 Forking Cluster 并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。 Broadcast Cluster 广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。 6 集群模式配置 按照以下示例在服务提供方和消费方配置集群模式 <dubbo:servicecluster="failsafe" /> 或 <dubbo:referencecluster="failsafe" /> 欢迎关注,欢迎留言探讨。 1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加群。 2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加群。 3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加群。 4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加群。 5.群号 468947140,点击链接加入群聊【Java-BATJ企业级资深架构】:https://jq.qq.com/?_wv=1027&k=5FksT0r 6.阿里Java高级大牛直播讲解知识点,分享知识,知识点都是各位老师多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册