首页 文章 精选 留言 我的

精选列表

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

Python全栈工程师 (exercises)

# 1:给定一个数,判断他是正数,负数,还是0 a = int(input("请输入一该个整数")) if a == 0: print(a, "是0") elif a > 0: print(a, "是正数") else: print(a, "是负数") # 练习2:输入一个季度的数字 输出该季度有那几个月 b = int(input("请输入一个季度:1.春季2.夏季3.秋季4.冬季")) if b > 4: print(b, "不是季节") elif b < 0: print(b, "不是季节") else: if b == 1: print(b, "春季有:一月,二月,三月") elif b == 2: print(b, "夏季有:四月,五月,六月") elif b == 3: print(b, "秋季有:七月,八月,九月") else: print(b, "冬季有:十月,十一月,十二月") # 联系3:输入一个月份 输出这个月份在那个季度 c = int(input("请输入一个月份判断在那个季度")) if c < 0: print(c, "不是月份") elif c > 12: print(c, "不是月份") elif c < 4: print(c, "在春季") elif c < 7: print(c, "在夏季") elif c < 10: print(c, "在秋季") elif c <= 12: print(c, "在冬季") # 练习4:3公里内10元 超出1.9元/公里 超过15公里 每公里加50%回空费 3.15元/公里 # 输入公里 打印车费 d = int(input("请输入行驶公里数:")) if d <= 3: print("车费:10元") elif d > 4: if d < 15: g = (d - 3) * 1.9 + 10 print(d, "公里:", g, "元") else: f = (d - 15) * 3.15 * 1.5 + 12 * 1.9 + 10 print(d, "公里:", f, "元") elif d < 0: print("公里数输入错误") 练习: 1. 一个商店卖西瓜,7元一个,您带20元钱能买到几个西瓜? 剩多少元? 2. 一个学生毕业薪资10000元,每个涨薪 20%,请问十年后这个学生的薪资是多少? 1. 打印如下图形: ******* * * * * ******* 2. 已知矩形的长边长为6cm,短边长为4cm,用表达式求 1) 周长是多少? 2) 面积是多少? 练习: 1. 指定一个圆的半径是r = 9cm 1) 计算圆的周长 2) 计算圆的面积 2. 交量交换练习: 已知有两个变量: a 绑定 10000 b 绑定 20000 问,在不创建任何新数据对象的情况下,如何让a 和 b 交换绑定的对象 a = 10000 b = 20000 .... print(a) # 20000 print(b) # 10000 练习: 1. 中国古代的秤是16两一斤,请问古代对216两是古代的几斤几两,写程序打印出来? 2. 从凌晨 0:0:0 计时,到现在已经过了63320秒, 请问现在是几时,几分,几秒,写程序打印出来 提示: 可以用地板除和求余实现 3. 温度转换: 摄氏温度 = 5.0/9.0*(华氏温度-32) 请问100华氏温度是多少摄氏温度.写程序算出来 思考: 如果知道当前温度是摄氏温度度,能否算出华氏温度是多少? 练习: 将数字3.14 用变量pi绑定 将pi变量转为整数,用变量i绑定 将 pi 变量 与 i变量相减,结果用f变量绑定 1. 判断f是否等于 0.14? 为什么? 2. 删除所有的变量 (用交互模式来实现) 练习: 1. 输入两个整数, 分别用变量x, y绑定 1) 计算这两个数的和,并打印结果 2) 计算这两个数的积,并打印结果 3) 计算x的y次方并打印结果 如: 请输入x: 10 请输入y: 20 打印如下: 10 + 20 = 30 10 * 20 = 200 10 ** 20 = ... 2. 今天是小明20周岁的生日,假设每年有365天,计算它过了多少个星期天,余多少天 3. 分三次输入当前的小时,分钟和秒数,在终端打印时此距离凌晨0:0:0 秒过了多少秒 练习: 任意输入一个数 1) 判断这个数是否大于100 2) 判断这个数是否小于0 3)判断这个数是否在80~100之间 练习: 1. 输入一个季度 1~4的整数.输出这个季度有哪儿几个月,如果输入的不是1~4的整数,则提示用户您输错了 2. 输入一年中的月份(1~12) 输出这个月在哪儿个季度,如果输入的是其它数,则提示您输错了 思考: score = input('请输入学生成绩:') or '0' score = int(score) 请问这个or是在做什么? 练习: 1. 北京出租车计价: 收费标准: 3公里以内收费13元 基本单价: 2.3元/公里 (超出3公里以外) 空驶费:超过15公里后,每公里加收单价的50%的空驶费(即3.45元/公里) 要求: 输入公里数,打印出费用金额(以元为单位四舍五入) 2. 输入一个学生的三科成绩(三个整数): 打印出最高分是多少? 打印出最低分是多少? 打印出平均分是多少? 3. BMI指数(Body Mass Index) 以称身体质量指数 BMI值计算公式: BMI = 体重(公斤) / 身高的平方(米) 例如: 一个人69公斤,身高是173公分 BMI = 69 / 1.73**2 = 23.05 标准表: BMI < 18.5 体重过轻 18.5 <= BMI < 24 体重正常 BMI > 24 体重过重 要求: 输入身高的体重,打印出BMI的值并打印体重状况 思考: 如果一个字符串同时包含如下字符该怎么办? ' " ''' """ 练习: 试求出以下字符串含有多少个字符? '1234abcd' # 8 '5\'4"' # 4 '\"A\x34\U00006041' # 4 '\b\n\td\r' '\\nn\\x41' 练习: 写一个程序,打印一个高度为4行的矩形方框 要求输入一个整形数字,此整数代表矩形的宽度,输出此矩形 如: 请输入矩形宽度: 10 ########## # # # # ########## 请输入矩形宽度: 5 ##### # # # # ##### 练习: 输入一个字符串,打印如下内容: 1. 打印这个字符串的第一个字符 2. 打印这个字符串的最后一个字符 3. 如果这个字符串的长度是奇数,打印中间这个字符 注: 求字符串的长度的函数len(s) 练习: 1. 写一个程序,输入一个字符串,把字符串的第一个字符和最后一个字符去掉后,打印出处理后的字符串 2. 输入任意一个字符串,判断这个字符串是否是回文 回文示例: 上海自来水来自海上 ABCCBA 12321 (回文是指中心对称的文字) 练习: 1. 写一个程序,输入一段字符串,如果字符串不为空,把第一个字符的编码值打印出来 2. 写一个程序,输入一个整数值(0~65535), 打印出这个数值所对应的字符 练习: 1. 输入一个字符串用变量s绑定 1) 判断您输入的字符串有几个空格 2) 将原字符串的左右空白字符去掉, 打印出剩余的字符个数 3)判断您输入的是否是数字 4) 如果是数字,判断这个数字是否大于100 2. 输入三行文字,让这三行文字在一个方框内居中显示 如输入: hello! I'm studing python! I like python 显示如下 +---------------------+ | hello! | | I'm studing python! | | I like python | +---------------------+ 注:请不要输入中文 练习: 输入三行文字,让这三行文字依次以20个字符的宽度右对齐输出 如: 请输入第1行: hello world 请输入第2行: aaa 请输入第3行: ABCDEFG 输出结果如下: hello world aaa ABCDEFG 做完上面的题后思考: 能否以最长的字符串的长度进行右对齐显示(左侧填充空格) 问题: 输入一个整数n, 写程序打印如下: 这是第 1 行 这是第 2 行 这是第 3 行 ... 这是第 n 行 问题: 如何让一条语句重复执行多次? 用: print("这是第", i, '行') 能否实现 练习: 1. 输入一行字符串,将字符串中Unicode编码值最大的一个字符打印出来(不允许用max函数) (提示: while语句内可以嵌入 if 语句进行判断) 2. 打印 从零开始的浮点数,每个数增加 0.5, 打印出10以内的这样的数: 0.0 0.5 1.0 1.5 ... 9.5 练习: 1. 打印 1 ~ 20的整数 2. 打印从10开始 到 0(不包含0)之间的整数 3. 打印 1 ~ 20的整数,打印在一行内 4. 打印 1 ~ 20的整数,每行打印5个,打印四行如: 1 2 3 4 5 6 7 8 9 10 11 12 ..... ..... 提示: while中可以嵌入if语句来换行 5. 输入一个整数n, 打印出一个长方形 n 代表长方形的宽度的字符数和高的行数 例如: 请输入:4 打印: #### # # # # #### 请输入:6 打印: ###### # # # # # # # # ###### 练习: 输入一个数,打印指定宽度的正方形 如: 输入: 5 打印如下正方形: 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 如: 输入: 3 打印如下正方形: 1 2 3 1 2 3 1 2 3 练习: 1. 写程序,计算: 1 + 2 + 3 + 4 + ..... + 99 + 100的和 2. 写程序,任意输入一个数n,计算: 1 + 2 + 3 + 4 + ..... + (n-1) + n的和 问题: 如果在循环过程中不想再继续此循环语句的执行了,怎么办? 练习: 1. 任意输入一些数,当输入负数时结束输入 当输入完成后,打印您输入的这些数的和是多少? 2. 写程序求: Sn = 1 + 1/2 + 1/4 + 1/8 + .... + 1/(2**n) 求当n等同于100时,sn的值是多少? 3. 用while语句实现打印三角形,输入一个整数,表示三角形的宽度和高度,打印出相应的直角三角形: 如: 请输入三角形的宽度: 4 1) 打印如下: * ** *** **** 2) 打印如下: * ** *** **** 3) 打印如下: **** *** ** * 4) 打印如下: **** *** ** * 练习: 任意输入一段字符串 1) 计算您输入的字符'A' 的个数,并打印出来 2) 计算出空格的个数,并打印出来 (要求用for语句,不允许使用, S.count方法) 思考用while语句能否实现上述功能 练习: 用for 语句打印1~20 打印在一行内 练习: 求 100以内有哪儿些整数与自身+1的乘积再对11求余的结果等于8? x * (x+1) % 11 == 8 x附合条件 1. 写程序计算 1 + 3 + 5 + 7 + ...+ 99的和 (要求用for语句和while语句两种方式实现) 2. 用while语句实现打印: 1 3 5 7 9. .... 19 打印在一行内 3. 将上题用for语句来实现 练习: 用for 语句实现下题 : 1. 输入一个数w代表正方形的宽度,打印如下正方形: 如输入:5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 2. 写程序来改写上题: 如输入: 5 打印如下: 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 5 6 7 8 9 如输入: 3 打印如下: 1 2 3 2 3 4 3 4 5 练习: 1. 输入一个整数用begin绑定, 再输入一个整数用end绑定 打印从begin开始,到end结束内的全部奇数(不包含end) 2. 将上述练习改写为 用while语句实现 3. 求 1~100 之间所有不被 5, 7, 11 整除的数的和 (可以考虑用continue实现) 练习: 1 输入三行文字,将这三行文字, 保存于一个列表L中,并打印 如: 请输入: abc<回车> 请输入: 123<回车> 请输入: 你好<回车> 生成列表如下: L = ['abc', '123', '你好'] print(L) 打印 练习: 1. 输入任意行文字,存于列表L中,当不输入任何内容直接回车后结束输入 1) 打印L列表中的内容 2) 计算您共输入了几行内容 3) 计算您共输入了多少个字符 2. 输入一个整数(代表树干的高度) 打印出如下一棵树 输入: 2 打印: * *** * * 输入:3 * *** ***** * * * 3. 写一个程序,任意输入一个整数,判断这个数是否是素数(prime) 素数(也叫质数), 是只能被1和自身整除的正整数: 如: 2 3 5 7 11 等 提示: 用排除法: 当判断x是否是素数是,只要让x分别除以: 2, 3, 4, 5, .... x-1, 只要整除了,那x不是素数,否则x是素数 4.算出100~1000以内的水仙化数(Naricissistic Number) 水仙花数是指百位的3次方 加上 十位的3次方 加上 个位的3次方等于原数的数 如: 153 = 1**3 + 5**3 + 3**3 答案: 153, 370, .... 练习: 已知有列表: L = [3, 5] 1) 用索引和切片等操作,将原列表改变为: L = [1, 2, 3, 4, 5, 6] 2) 将列表反转,删除最后一个元素后打印此列表 ... print(L) # [6, 5, 4, 3, 2] 练习: 1. 写程序,让用户输入一些整数,当输入-1时结束输入,将这些数存于列表L中 1) 打印用户共输入了几个数? 2) 打印您输入的数的最大数是多少 3) 打印您输入的数的最小数是多少 4) 打印您输入的这些数的平均值是多少? 练习: 输入多行文字,存入列表中, 每次输入回车后算一行 任意输入多行,当输入回车(即输入空行时结束输入) 1) 按原输入内容在屏幕上输出内容 2) 打印出您共输入了多少行文字 3) 打印出您共输入了多少个字符 练习: 1. 有字符串"hello" 请用此字符串生成: 'h e l l o' 和 'h-e-l-l-o' 答案: s = "hello" a = ' '.join(s) # a = 'h e l l o' b = '-'.join(s) # b = 'h-e-l-l-o' 2. 写一个程序,让用户输入很多正整数,当输入小于零的数时结束输入, 1) 打印这些数中最大的一个数 2) 打印这些数中第二大的一个数 3) 删除最小的一个数 4) 打印剩余数的和 练习: 用列表推导式生成1~100内奇数的列表 结果是: [1, 3, 5, 7, ..... 99] L = [x for x in range(1, 100, 2)] 示例: 生成1~00内的奇数的列表: L = [x for x in range(1, 100) if x % 2 == 1] 练习: 生成一个数值为 1 ~ 9的平方的列表,去掉所有的奇数的平方 L = [x**2 for x in range(1, 10)] # L = [4, 16, 36, 64] 练习: 1. 已知有一个字符串 s = '100,200,300,500,800' 将其转化为整数的列表存于L列表中 L = [100, 200, 300, 500, 800] 2. 生成前40个斐波那契数(Fibonacci) 1 1 2 3 5 8 13 ..... 要求将这些数保存在列表中 打印这些数 3. 有一些数存于列表中: L = [1, 3, 2, 1, 6, 4, 2, ..... 98, 82] 将列表中出现的数字存入到另一个列表L2中 要求: 重复出现多次的数字在L2列表中只保留一份(去重) 写程序,实现以下要求: 1) 将如下数据形成一个字典seasons: '键' '值' 1 '春季有1, 2, 3月' 2 '夏季有4, 5, 6月' 3 '秋季有7, 8, 9月' 4 '冬季有10,11,12月' 2) 让用户输入一个整数,代表一个季度,打印这个季度对应的信息,如果用户输入的信息不在字典内,则打印信息不存在 练习: 输入一段字符串,打印出这个字符串中出现过的字符的出现次数 如: 输入: abcdabcaba 打印: a: 4次 b: 3次 d: 1次 c: 2次 注: 不要求打印的顺序 练习: 有字符串的列表如下: L = ['tarena', 'xiaozhang', 'tyke'] 用上述列表生成如下字典: d = {'tarena': 6, 'xiaozhang': 9, 'tyke':4} 注: 字典的值为键的长度 练习: 1. 已知有两个等长的列表 list1 和 list2 以list1中的元素为键,以list2中的元素为值,生成相应的字典 list1 = [1001, 1002, 1003, 1004] list2 = ['Tom', 'Jerry', 'Spike', 'Tyke'] 生成的字典为: {1001: 'Tom', 1002:'Jerry', .....} 2. 输入任意个学生的姓名,年龄,成绩,每个学生的信息存入字典中,然后放入至列表中,每个学生的信息需要手动输入 当输入姓名为空时结束输入: 如: 请输入姓名: xiaozhang 请输入年龄: 20 请输入成绩: 100 请输入姓名: xiaoli 请输入年龄: 18 请输入成绩: 98 请输入姓名: <回车> 结束输入 要求内部存储格式如下: [{'name':'xiaozhang', 'age':20, 'score':100}, {'name':'xiaoli', 'age':18, 'score':98}] 打印所有学生的信息如下: +---------------+----------+----------+ | name | age | score | +---------------+----------+----------+ | xiaozhang | 20 | 100 | | xiaoli | 18 | 98 | +---------------+----------+----------+ 集合练习: 经理有: 曹操,刘备,孙权 技术员有: 曹操,孙权,张飞,关羽 用集合求: 1) 即是经理,也是技术员的有谁? 2) 是经理,但不是技术员的人员都有谁? 3) 是技术员,不是经理的都有谁 4) 张飞是经理吗? 5) 身兼一职的人都有谁? 6) 经理和技术员共有几个人? 练习: 任意输入一些数字,存于列表L中。当输入负数时结束输入 1) 打印这些数的和 2) 打印这些数有多少种(去重) 3) 除重复的数字后,打印这些剩余数字的和 提示,可以用集合去重 练习: 1. 写一个函数myadd, 此函数中的参数列表里有两个参数x, y 此函数的功能是打印 x + y 的和 def myadd(....): .... # 注: .... 部是是我们要填写代码的地方 myadd(100, 200) # 300 print("ABC", "123") # ABC123 2. 写一个函数 mysum, 传入一个参数x代表终止整数, 打印出 1 + 2 + 3 + 4 + ..... + x的和 def mysum(x): .... mysum(100) # 5050 mysum(4) # 10 return 语句 语法: return [表达式] 注: [] 代表可省略 作用: 用于函数中,结束当前函数的执行,返回到调用该函数的地方,同时返回一个对象的引用关系 return 语句说明 1. return 语句后跟的表达式可以省略,省略后相 当于return None 2. 如果函数内没有return 语句,则函数执行完最后一条语句后返回None(相当于在最后加了一条return None语句) 示例见: return.py 练习: 1. 写一个函数 mymax, 给函数传递两个参数,返回两个实参中最大的一个 def mymax(a, b): .... v = mymax(100, 200) print('v =', v) # v = 200 print(mymax('ABC', 'abc')) # abc 2. 写一个函数 input_number def input_number(): .... 此函数用来获取用户循环输入的整数,当用户输入负数时结束输入。将用户输入的数字以列表的形式返回,再用内建函数max, min, sum取出户输入的最大值,最小值及和 L = input_number() print(L) # 打印此列表 print("用户输入的最大数是:", max(L)) print("用户输入的最小数是:", min(L)) print("用户输入的数的和是:", sum(L)) 练习: 1. 写一个函数 print_odd, 打印从begin开始,到end结束(不包含end)内的全部的奇数 def print_odd(begin, end): .... print_odd(1, 10) # 打印 1 3 5 7 9d ptint_odd(10, 20) # 打印 11 13 15 17 19 2. 定义两个函数: sum3(a, b, c) 用于返回三个数的和 pow3(x) 用于返回x的三次方 用以上函数计算: 1. 计算1的立方 + 2的立方 + 3的立方的和 即: 1**3 + 2**3 + 3**3的和 2. 计算1 + 2 + 3 的和的立方, 即:(1+2+3)**3 3. 改写之前的学生信息管理程序 改为两个函数: 1. 写一个函数 input_student() 用于返回学生信息的字典的列表(以前格式一样) 2. 写一个函数 output_student(lst) 此函数传入一个列表lst,即字典的列表 此函数把lst的内容以表格形式打印出来 def input_student(): .... def output_student(lst): ... L = input_student() # 获取学生信息的列表 output_student(L) # 把L 以列表的形式打印 练习: 写一个函数minmax(a, b, c) 有三个参数,这回这三个参数中的最小值和最大值, 要求,形成元组,最小值在前,最大值在后,如: def minmax(a, b, c): ... t = minmax(11, 33, 22) print(t) # (11, 33) # <<< 打印元组 xiao, da = minmax(6, 5, 4) print('最小值:', xiao, '最大值:', da) 练习: 写一个函数 myadd, 此函数可以计算两个数的和,也可以计算三个数的和 def myadd(......): .... print(myadd(10, 20)) # 30 print(myadd(100, 200, 300)) # 600 2. 写一个函数,print_odd, 此函数可以传递一个实参,也可以传递两个实参,当传递一个实参时代表结束值 当传递两个实参时,第一个实参代表起始值,第二个实参代表结束值 打印出以此区间内的全部奇数,不包含结束数: print_odd(10) # 1 3 5 7 9 print_odd(11, 20) # 11 13 15 17 19 练习: 写一个函数, mysum可以传入任意个实参的数字,返回所有实参的和 def mysum(*args): ... print(mysum(1, 2, 3, 4)) # 10 print(mysum(10, 20, 30)) # 60 练习: 写一个函数,mymax类似于 内键的函数max 详见: >>> help(max) 仿造 max 写一信mymax函数,功能与max完全相同 (要求不允许调用max函数) print(mymax([6, 8, 3, 5])) # 8 print(mymax(100, 200)) # 200 print(mymax(1, 3, 5, 9, 7)) # 9 思考题: 查看 >>>help(print)猜想print函烽的参数列表 是如何定义的? 练习: 创建一个全局变量 L = [] 写一个函数: def input_number(): .... 此函数每次调用将从键盘读入一些数字追加到列表L中 如: L = [] def input_number(): .... input_number() print(L) # [ .... 这些是您从键盘输入的数..] 练习: 1. 写一个函数isprime(x) 判断x是否为素数。如果是素数,返回True,否则返回False 2. 写一个函数prime_m2n(m, n) 返回从m开始,到n结束(不包含n)范围内的素数,返回这些素数的列表并打印 如: L = prime_m2n(5, 10) print(L) [5, 7] 3. 写一个函数pimes(n) 返回小于n的全部素数的列表,并打印这些素数 如: L = primes(10) print(L) # [2, 3, 5, 7] 1) 打印100 以内的全部素数 2) 打印200 以内的全部素数的和 4. 编写函数 fn(n) 此函数返回下列级数的和: fn(n) = 1/(1*2) + 1/(2*3) + .... + 1/(n*(n-1)) 的和 print(fn(100)) 练习: 写一个计算公式的解释执行器 已知有如下一些函数: def myadd(x, y): return x + y def mysub(x, y): return x - y def mymul(x, y): return x * y 写一个函数,传入字符串,返回相应的函数 def get_op(s): # 此函数根据字符串来返回相应的函数. # 如果传入字符串"加" 则返回myadd函数 # .... '乘',则返回mymul函数 ... 此处自己实现 主程序如下: while True: s = input("请输入计算公式: ")# 10 加 20 L = s.split() a = int(L[0]) b = int(L[2]) fn = get_op(L[1]) print("结果是:", fn(a, b)) # 30 练习: 写一个函数叫hello(name),部分代码如下: count = 0 def hello(name): print('你好', name) ... 此处代码省略,需要同学们自己填写 ... 此处代码需要改变全局变量来记录此函数曾经被调用过多少次. hello('小张') hello('小李') print('hello 函数被调用', count, '次') # 2次 练习: 1. 写一个lambda 表达式,判断这个数的2次方+1是否能被5整除,如果能被整除返回True, 否则返回False 例: fa = lambda x: ..... print(fa(2)) # True print(fa(4)) # False 2. 写一个lambda表达式,求两个变量的最大值 例如: def mymax(x, y): ... mymax = lambda ... print(mymax(100, 200)) # 200 练习: 1. 给出一个整数n,写一个函数myfac来计算n!(n的阶乘) n! = 1 * 2 * 3 * 4 * ..... * n 如: print(myfac(5)) # 120 2. 给出一个整数n,写一个函数计算myfn(n): 1 + 2**2 + 3**3 + .... + n**n的和 如: print(myfn(10)) # ??? 3. 完全数: 1 + 2 + 3 = 6 (6为完全数) 1,2,3都为6的因数(因数是能被一个数x整除的整数为y,则y为x的因数) 1 x 6 = 6 2 x 3 = 6 完全数是指除自身以外的所有因数相加之和等于自身的数 求 4~5个完全数并打印出来 答案: 6 28 496 ...... 4 实现带有界面的学生信息管理系统 程序启动时先弹出操作菜单: +-------------------------+ | 1) 添加学生信息 | | 2) 显示学生信息 | | 3) 删除学生信息 | | 4) 修改学生成绩 | | q) 退出 | +-------------------------+ 请选择: 1 要求 : 每个选择都要有一个函数来实现 练习: 1. 用map函数求: 1**3 + 2**3 + 3 ** 3 + .... 9**3 的和 2. 用map函数求: 1**4 + 2**4 + 3 ** 4 + .... 20**4 的和 提示: sum(map(.....)) 练习: 1. 将 1 ~ 20 的偶数用filter生成可迭代对象后将可迭代对象生成的数放入到列表L中 2. 写一个函数is_prime(x) 判断x是否是素数 用filter函数打印出: 20 ~ 30之间的全部素数 练习: names = ['Tom', 'Jerry', 'Spike', 'Tyke'] 排序的依据为字符串的反序: 'moT' yrreJ ekipS ekyT 结果: ['Spike', 'Tyke', 'Tom', 'Jerry'] 练习: 写函数 mysum(n)用递归方式实现求和 def mysum(n): # 用递归方式求和 ... print(mysum(100)) # 5050 思考题: 已知五位朋友在一起 第五位朋友比第四位朋友大2岁 第四位朋友比第三位朋友大2岁 第三位朋友比第二位朋友大2岁 第二位朋友比第一位朋友大2岁 第一位朋友说它10岁 练习: 1. 已知五位朋友在一起 第五位朋友比第四位朋友大2岁 第四位朋友比第三位朋友大2岁 第三位朋友比第二位朋友大2岁 第二位朋友比第一位朋友大2岁 第一位朋友说它10岁 写程序打印出第五位朋友 和第三位朋友 的年龄 2. 已知有列表: L = [[3, 5, 8], 10, [[13, 14], 15, 18], 20] 1) 写一个函数print_list(lst) 打印出所有元素 print(L) # 打印 3 5 8 10 13 14 .... 2) 写一个函数sum_list(lst) 返回这个列表中所有元素的和 print(sum_list(L)) # 86 注: type(x) 可以返回一个变量的类型 如: >>> type(20) is int # True >>> type([1, 2, 3]) is list # True 3. 改写之前的学生信息管理程序 要求添加四个功能: | 5) 按学生成绩高-低显示学生信息 | | 6) 按学生成绩低-高显示学生信息 | | 7) 按学生年龄高-低显示学生信息 | | 8) 按学生年龄低-高显示学生信息 | 练习: 1. 输入一个圆的半径,打印出这个圆的面积 2. 输入一个圆的面积,打印出这个圆的半径 (要求用math模块内的函数和数据实现) 练习: 写一个程序,输入你的出生日期, 1) 算出你已经出生多少天? 2) 算出你出生的那天是星期几? 练习: 1. 请编写函数fun 其功能是计算下列多项式的和: fn = 1 + 1/1! + 1/2! + 1/3! + 1/4! + .. + 1/n! (建义用数学模块的factorial实现) 求当n 等于100时,fn的值 看一下fn(100)的值是什么 2. 写一个程序,以电子时钟格式: HH:MM:SS格式显示时间 要求每隔一秒变化一次 3 写函数f(n)求下多项式的和 fn = 1/1 - 1/3 + 1/5 - 1/7 + 1/9 .... 1/(2*n-1)的和 求当n取值为1000000时, 1) 打印 f(1000000) 的值 2) 打印 f(1000000) * 4的值,看看是什么 练习: 1. 猜数字游戏 随机生成一个 0~100之间的一个整数,用变量x绑定 让用户输入一个数y,输出猜数字的结果: 1) 如果y大于x则提示: "您猜大了" 2) 如果y小于x则提示: "您猜小了" 3) 如果y等于生成的数x,则提供示用户"恭喜您猜对了 "并退出猜数字 循环重复上述步聚,直到猜对为止。 猜对了,显示用户猜数字的次数,然后退出程序 练习: 1. 写一个闹钟程序,启动时设置定时时间, 到时间后打印一句"时间到...." 然后退出程序 2. 模拟斗地主发牌,扑克牌共54张 黑桃('\u2660'), 梅花('\u2663'), 方块('\u2665'), 红桃('\u2666') A2-10JQK 大王、小王 三个人玩,每人发17张牌,底牌留三张 输入回车, 打印出第1个人的17张牌 输入回车, 打印出第2个人的17张牌 输入回车, 打印出第3个人的17张牌 输入回车, 打印三张底牌 3. 修改学生信息管理程序,将原student_info.py 拆分为模块 要求: 1. 主事件循环放在main.py中 2. show_menu 函数放在menu.py中 3. 与学生操作相关的函数放在 student_info.py中 练习: 写一个函数 get_score() 来获取学生成绩, 要求用户输入 1~100的整数,输果输入出现异常,返此函数返回0, 否则返回用户输入的成绩 示例: def get_score(): ... score = get_score() print("学生的成绩是:", score) python中全部的错误类型: 参见文档: python_base_docs_html/Python全部的异常类型.html 练习: 写一个函数 get_age()用来获取一个人的年龄信息 此函数规定用户只能输入1~140之间的整数,如果用户输入其它的数则直接触发ValueError类型的错误通知 如果用户输入的年龄大于140,则触发 ValueError("年龄超出了正常值") 如果用户输入的年龄小于1,则触发 ValueError("年龄太小...") def get_age(): ... try: age = get_age() print("用户输入的年龄是:", age) except ValueError as err: print('用户输入的不是1~140的整数,获取年龄失败') print("原因是:", err) 练习: 1. 一个球从100米高空落下,每次落地后反弹高度是原高度的一半,再落下, 1) 写程序算出皮球在第10次落地后反弹高度是多高? 2) 打印出球共经过多少米的路程 2. 分解质因数, 输入一个正整数,分解质因数, 如: 输入: 90 则打印: '90=2*3*3*5' (质因数是指最小能被原数整除的素数(不包括1)) 3. 修改原学生信息管理程序,加入异常处理语句,让程序在任何情况下都能够按逻辑正常执行. 例如: 输入成绩和年龄时,如果用户输入非法字符串也不会导致程序崩溃 练习: 有一个集合: s = {'唐僧', '悟空', '八戒', '沙僧'} 用 for语句来遍历所有元素如下: for x in s: print(x) else: print('遍历结束') 请将上面的for语句改写为 用while语句和迭代器实现 练习: 写一个生成器函数 myeven(start, stop) 此函数用来生成从 start开始到stop结束(不包含)区间内的一系列偶数 def myeven(start, stop): .... evens = list(myeven(10, 20)) print(evens) # [10, 12, 14, 16, 18] for x in myeven(21, 30): print(x) # 22, 24, 26, 28 L = [x**2 for x in myeven(3, 10)] print(L) # 16 36 64 练习: 已知有一个列表L L = [2, 3, 5, 7] 用生成器表达式从此列表中拿到数,生成 列表中数据的平方 gen = ...... # 此处用生成器表达式实现 L2 = list(gen) # L2 = [4, 9, 25, 49] 思考: L = [2, 3, 5, 7] L2 = [x ** 2 for x in L] # 列表推导式 it = iter(L2) print(next(it)) # 4 L[1] = 10 print(next(it)) # 9 L = [2, 3, 5, 7] G3 = (x ** 2 for x in L) # 生成器表达式 it = iter(G3) print(next(it)) # 4 L[1] = 10 print(next(it)) # 100 练习: 写一个程序,读入任意行的文字,当输入空行时结束输入 打印带有行号的输入结果: 如: 请输入: hello<回车> 请输入: world<回车> 请输入: tarena<回车> 请输入: <回车> # 直接回车结束输入 输出如下: 第1行: hello 第2行: world 第3行: tarena 练习: 写一个程序,从键盘输入一段字符串存入s变量 1. 将此字符串转为字节串用变量b绑定,并打印出b 2. 打印字符串s的长度和字节串b的长度 3. 将b字节串再转换为字符串用变量s2 绑定,判断 s2 和 s是否相同? 练习: 1. 写一个生成器函数primes生成素数, 此生成器函数为 primes(begin, end) 如: [x for x in primes(10, 20)] 将得到列表 [11, 13, 17, 19] 2. 写一个生成器函数,生成斐波那契数列的前n个数 1 1 2 3 5 8 13 def fibonacci(n): ... yield... 1) 输出前20个数: for x in fibonacci(20): print(x) 2) 打印前40个数的和: print(sum(fibonacci(40))) 3. 写程序打印杨辉三角(只打印6层) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 练习: 自己写一个文件 'info.txt' 内部存一些文字信息 如: 张三 20 100 李四 21 96 小王 22 98 写程序将这些数据读取出来,打印到终端上 练习: 1. 写程序,循环输入很多个人的姓名,电话号码, 当输入结束后将这些信息存入到文件phonenumber.txt中 (建议先用列表暂存数据,格式自己定义) 2. 写程序,将phonenumber.txt文件中的数据读取出来. 再用以下格式打印出来: 如: 小张 的电话是 13888888888 小李 的电话是 13999999999 练习: 1. 写程序实现复制文件的功能 要求: 1. 要考虑特大文件问题 2. 要关闭文件 3. 要能复制二进制文件 如: 请输入源文件路径名: /home/tarena/xxx.tar.gz 请输入目标文件路径名: ./a.tar.gz 显示: 文件已成功复制 2. 修改学生信息管理程序,要求加入两个功能: 9) 保存信息到文件(si.txt) 10) 从文件中读取数据(si.txt) 练习: 自己写一个'人'类: Human class Human: def set_info(self, name, age, address='未知'): '''此方法用来给人对象添加'姓名', '年龄', '家庭住址'三个属性''' ... # << 此处自己实现 def show_info(self): '''显示此人的全部信息''' ... # 此处自己实现 如: h1 = Human() h1.set_info('小张', 20, '北京市朝阳区') h2 = Human() h2.set_info('小李', 18) h1.show_info() # 小张今年 20 岁,家庭住址:北京市朝阳区 h2.show_info() # 小李今年 18 岁,家庭住址:末知 练习: 写一个Student类 1) 为该类添加初始化方法, 实现在创建对象时自动设置 '姓名','年龄', '成绩' 属性 2) 添加set_score方法能修改成绩信息 3) 添加show_info方法打印学生对象的信息 如: class Student: def __init__(...): ... ... s1 = Student('小王', 15, 59) s1.show_info() # 小王 今年 17 岁, 成绩是: 59 s1.set_score(80) s1.show_info() # 小王 今年 17 岁, 成绩是: 80 面向对向的综合示例: 有两个人(Human): 1. 姓名: 张三 年龄: 35 2. 姓名: 李四 年龄: 8 行为: 1. 教别人学东西 teach 2. 赚钱 works 3. 借钱 borrow 事情: 张三 教 李四 学 python 李四 教 张三 学 跳皮筋 张三 上班赚了 1000 元钱 李四 向 张三 借了 200 元钱 打印张三的信息: 35岁 的 张三 有钱 800元, 它学会跳皮筋 打印李四的信息: 8岁 的 李四 有钱 200元, 它学会python 练习: 修改原来的学生信息管理程序,将原来字典来存储学生信息, 现改为用对象来存储学生信息 # file : student.py class Student: def __init__(self, n, a, s): .... L = [] # L.append({...}) 改为对象 L.append(Student('xiaozhang', 20, 100)) (要求类Student 要写在模块 student.py中) 练习: 用类来描述一个学生的信息(可以修改之前写的Student类) class Student: .... 此处自己实现 学生信息有: 姓名, 年龄, 成绩 将一些学生的对象存于列表中,可以任意添加和删除学生信息 1) 打印出学生的个数 2) 打印出所有学生的平均成绩 3) 打印出所有学生的平均年龄 思考: list类里只有一个append向末尾加一个元素的方法,但没有向列表头部添加元素的方法,试想能否为列表在不改变原有类的基础上添加一个insert_head(n) 方法,实现在列表的头部(前部)添加元素 如: class MyList(list): def insert_head(self, n): ... # 需要自己添加代表 myl = MyList(range(3, 6)) print(myl) # [3, 4, 5] myl.insert_head(2) print(myl) # [2, 3, 4, 5] myl.append(6) print(myl) # [2, 3, 4, 5, 6] 练习: 1. 看懂学生管理程序,每一步做的事情及思想 2. 把同学们自己的学生信息管理程序用Student学生对象来存储信息;要求,不要在外部直接操作学生的属性,所有操作行为用方法来代替 练习: 写一个类Bicycle类 ,有 run方法.调用时显示骑行里程km class Bicycle: def run(self, km): print('自行车骑行了', km, '公里') 再写一个类EBicycle(电动自行车类), 在Bicycle类的基础上添加了电池电量 volume 属性, 有两个方法: 1. fill_charge(self, vol) 用来充电, vol为电量 2. run(self, km) 方法每骑行10km消耗电量1度,同时显示当前电量,当电量耗尽时调用 父类的run方法继续骑行 b = EBicycle(5) # 新买的电动有内有5度电 b.run(10) # 电动骑行了10km还剩 4 度电 b.run(100) #电动骑行了40km,还剩0度电,其余60用脚登骑行 b.fill_charge(10) # 又充了10度电 b.run(50) # 骑行了50公里剩5度电 练习: 1. 修改原有的学生信息管理系统, 将学生对象的,全部属性 都变为私有属性,不让外部直接访问来实现封装 2. 写一个列表类MyList实现存储整数列表,写类的定义如下: class MyList: def __init__(self, iterator): self.data = ... 让此类的对象能用for语句进行迭代访问 L = MyList(range(5)) print(L) L2 = [x ** 2 for x in L] print(L2) # [0, 1, 4, 9, 16] 3. 写一个类Fibonacci 实现迭代器协议 ,此类的对象可以作为可迭代对象生成相应的斐波那契数 1 1 2 3 5 class Fibonacci: def __init__(self, n) # n代表数据的个数 ... ... 实现如下操作: for x in Fibonacci(10): print(x) # 1 1 3 5 8 .... L = [x for x in Fibonacii(50)] print(L) F = fibonicci(30) print(sum(F)) 练习: 1. 实现两个自定义的列表相加 class MyList: .... 此处自己实现 L1 = MyList([1, 2, 3]) L2 = MyList(range(4, 7)) L3 = L1 + L2 print(L3) # MyList([1, 2, 3, 4, 5, 6]) L4 = L2 + L1 print(L4) # MyList([4, 5, 6, 1, 2, 3]) L5 = L1 * 2 print(L5) # MyList([1, 2, 3, 1, 2, 3]) 练习: 实现有序集合类 OrderSet() 能实现两个集合的交集 &,全集 |, 补集 - 对称补集 ^, ==/!= , in/ not in 等操作 要求集合内部用 list 存储 class OrderSet: ... s1 = OrderSet([1, 2, 3, 4]) s2 = OrderSet([3, 4, 5]) print(s1 & s2) # OrderSet([3, 4]) print(s1 | s2) # OrderSet([1, 2, 3, 4, 5]) print(s1 ^ s2) # OrderSet([1, 2, 5]) if OrderSet([1, 2, 3]) != OrderSet([3, 4, 5]): print("不相等") if s2 == OrderSet(3, 4, 5): print('s2 == OrderSet(3, 4, 5) is True') if 2 in s1: print("2在 s1中")

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

简单优化前端工程几种方式(上篇)

使用CDN 如果A网站和B网站, 同时使用了 https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js的资源, 在访问其他网站A时, 浏览器会缓存jquery.min.js资源文件, 访问网站B时,就可以免于下载jquery.min.js的文件, 这样既节省了服务器流量, 又提升了资源加载的速度, 一举两得~ 减少网络请求 使用雪碧图(用Photoshop将多个icon拼接到一张图上) 将多个js文件合并压缩为单个js文件(使用Webpack,或在线工具) 减少图片尺寸 可以使用PP鸭一键压缩, 具体介绍: PP鸭为你的图片瘦瘦瘦身 (支持快速压缩jpg, png, gif三种格式) 将图片保存为渐进式jpg 将图片保存为渐进式jpg后, 图片在浏览器显示时, 可以由模糊到清晰渐进式加载, 提升用户体验 将javascript脚本放到html的底部 HTML文件是从上往下渲染的, 如果js脚本有大量耗时操作, js执行期间, 用户是不能看到页面的 mdn的解释链接: https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web/JavaScript_basics 一般我们会把css样式文件放在html的头部, javascript脚本文件放在页面底部, 但什么事情都有特例, 比如bootstrap的部分组件依赖jquery,也就是jquery必须在bootstrap之前引入, 如果我们要在页面头部引入bootstrp样式的话, 那jquery也必须放到了页面的头部!

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

前端工程化之路-语法检查

javascript作为前端的利器,上可撸AI,下可写驱动,(好吧,我承认我瞎编的),但是js作为一门弱类型的动态语言,在给我们带来方便的同时,也会悄悄的埋下坑,尤其是在大型项目中,一不小心,就要加班填坑,所以为了愉(早)快(下)工(班)作,我们选择使用eslint作为javascript的语法检查工具,tslint作为TypeScript 的语法检查工具,我们的目标是 提高代码质量,避免低级的bug 规范化编码,统一代码风格 eslint官方地址 配置规则 eslint 和 tslint 的规则网上介绍已经非常多,配置项也简单易懂,为了避免该文章篇幅过长,配置规则文件另起一篇语法检查-配置规则 eslint 'extends': [ "eslint:recommended", "standard", "plugin:react/recommended", "plugin:vue/base", ], 推荐这几个插件,都是业内流行的规范,插件地址如下 standard react检查规范plugin:react/recommended vue检查规范plugin:vue/base tslint 开启如下插件 "extends": [ "tslint:recommended" ] 搭配vscode使用 推荐两个插件 eslint插件地址 可共享的配置 当有多个项目的时候,我们就可以考虑将配置独立出来,统一管理,可以通过npm来管理的配置文件,将配置文件独立为一个项目维护,如果是内网项目,可使用 npm install <git remote url> 进行安装 详细使用方法如下: npm install <git remote url>: <protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>] tip:项目名称需要按照这样的格式 eslint-config-mylint 在配置文件.eslintrc.js中,改为如下 module.exports = { "extends": [ "mylint" ] }; 填坑 行内规则 在某些情况下需要对个别文件和某行代码特殊处理时,使用注释的形式 eslint 该文件不参与语法校验 /* eslint-disable */ 允许使用 console /* eslint no-console: 0 */ or /* eslint-disable no-console */ tslint 该文件不参与语法校验 /* tslint:disable */ 允许使用 console /* tslint:disable:no-console */ jquery 与箭头函数 因为箭头函数的优势和其简洁,所以我们在项目中推荐使用箭头函数,箭头函数有个特性 箭头函数没有它自己的this值,箭头函数内的this值继承自外围作用域,没有局部this的绑定,即this不在是动态改变的 因部分项目还是基于jquery的,所以避免不了在dom元素上绑定事件监听函数,在使用 function的时候,dom事件被触发,回调函数中的this指向该dom,可当我们换成箭头函数时,this就不在是dom,而是上下文,举个栗子 <div class="outer"> <div class="inner">ww</div> </div> 复制代码 $('.outer').on('click', (event) => { console.log(this) // 不再是dom对象 console.log(event.target) // 这个才是dom对象 }) 因此在修改dom元素的监听事件回调的时候,记得要同步将this一同修改 currentTarget 与 target 的区别与使用 在监听的节点里面还有嵌套节点的情况下,使用event.target将会有问题,栗子如下 <div class="outer"> <div class="inner">cc</div> </div> // 在需要监听的节点里,还有嵌套节点的情况下,需要注意 $('.outer').on('click', (event) => { console.log(event.target) // 获取的是点击的对象 inner console.log(event.currentTarget) // 获取的监听的对象 outer }) 所以在点击 cc的时候,event.target获取到的是点击的元素对象,而监听的对象就需要改成这样获取 event.currentTarget,这个才是function 下的 this typescript 自定义声明文件 TypeScript 是javascript的超集,用起来那是一个爽啊,谁用都说好 公司内部研发了一套UI框架,在配合ts使用的时候,发现很多方法缺少声明,所以我们需要编写声明文件,官方地址如下 typescript-声明文件 鹅外话 css的格式化,我们推荐使用 csscomb ,且它还支持在线生成规则,不能在人性化了,目前对主流编辑器和构建工具都支持良好 原文发布时间为:2018年07月02日 原文作者: 小黎也 本文来源: 掘金 如需转载请联系原作者

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

Python全栈工程师(for、列表)

ParisGabriel Python 入门基础 for:用来遍历可迭代对象的数据元素可迭代对象是指以此获取数据元素的对象可迭代对象包括:字符串 str 列表 list元组 tuple字典 dict语法:for 变量列表 in 可迭代对象: L = ["a", "abc", "中国", 123] for x in L: print(x) else: print("结束") 说明:当循环内部使用break结束循环时,else将不再执行并且else 可以省略range()函数:range(stop) 从零开始,每次生成一个整数后加1操作,直到stop为止(不包含stop)range(star,stop[,step])从star开始每次生成一个整数后移动step,直到stop为止(不包含stop,且step可以是负数)help(range) 查询帮助作用:用来创建一个生成一系列整数的可迭代对象(也叫整数序列生成器) for x in range(0, 10, 3): print(x) 说明:range函数带调用返回的对象可用于for语句来进行依次迭代取出其中的函数for嵌套: for x in range(5): for y in range(3): print(x, y, "ABC") continue:用于循环语句中(while、 for )不再执行本次循环内continue之后的语句重新开始一次新的循环 for x in range(10): if x % 2 == 0: continue print(x) 说明:在while中直接跳到真值表达式重新判断在for中直接将可迭代对象内的元素绑定到下一个再次循环 列表 list:列表是一种容器(通常用来储存计算机的数据对象)列表是可以被改变的序列是由一系列特定元素组成的 元素与元素之间可能没有任何关联关系但他们由先后顺序关系空列表创建方式: L=[ ]列表是可迭代对象: 非空列表创建方式: 空列表: L = [] 非空列表: L = [1, 2, 3, 4] L = ["a", "b", "c"] L = [1, 2, ["a", "b", "c", "d"], 3, 4] 列表的构造函数list:list()等于空列表list(iterable)用可迭代对象创建一个列表列表的运算:+ 用于拼接列表+= 用于将右侧的可迭代对象的数据追加到原列表中* 用于生成重复列表*=列表的比较运算:< <= > >= == !=比较规则和字符串完全相同列表的in、notin:判断一个元素是否存在于列表中 如果纯在返true否则falsein 和 nat in 返回值相反 练习:1.用for实现:输入一个数W代表正方形的宽度:如1 2 3 4 51 2 3 4 51 2 3 4 51 2 3 4 51 2 3 4 5 答案: a = int(input("plaese input at will integer:")) for x in range(1, a + 1): for y in range(1, a + 1): print(y, end = " ") print() 改写上上题:1 2 3 4 52 3 4 5 63 4 5 6 74 5 6 7 85 6 7 8 9 第一种:a = int(input("plaese input at will integer:")) for x in range(1, a + 1): for y in range(x, a + x): print("0%2d" % y, end = " ") print() 第二种: a = int(input("plaese input at will integer:")) for x in range(1, a + 1): for y in range(x, a + x): print(y, end = " ") print() 2.输入任意文字,存于列表L中,当不输入任何内容直接回车后结束输入打印L列表中的内容计算你共输入几行内容、和多少个字符 答案: L = [] i = 0 while True: a = input("plaese input at will string:") if a == "": break i += len(a) L += [a] print(''' L = : %s you have entered:%d row %d Entries character ''' % (L, len(L), i)) 3.输入一个整数 (代表树干高度)打印出如下一颗树输入:2****** 输入3 ********* * * * 答案: a = int(input("plaese input at will integer:")) for x in range(1, a * 2, 2): print(("*" * x).center(a * 2)) else: for s in range(1, a * 2, 2): print("*".center(a * 2)) 4.任意输入一个整数 判断这个数是否是素数(prime)素数也叫质数,是只能被1和自身整除的数:如:2 3 5 7 11 等提示:用排除法:判断x是否是素数是,只要让x分别除以:2 3 4 5 ...-1只要整除了 那x不是素数,否则x是素数 答案: a = int(input("plaese input at will integer:")) for x in range(2, a): if a % x == 0: s = "it's not a prime" break else: s = "This is a prime" print(s 5.算出100 ~ 1000以内的水仙花数(naricissistic)水仙花数是指百位的3次方 加上十位的3次方 加上各位的3次方等于原数的数153=1**3+5**3+3**3 153 370 答案: for x in range(100, 1000): if (x // 100) ** 3 + ((x % 100) // 10) ** 3 + (x % 10) ** 3 == x: print(x)

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

Python全栈工程师(编码)

ParisGabriel Python 入门基础 补充: 主流3操作大系统 Windows: Winxp Win7 Win8 Win10 Unix: Solaris(SUN) IOS(Apple移动端) Mac OS Linux :(linux基于Unix 独立出来的系统) 安卓(Android) Ubuntu 16.04(当前教学版本) ReadHat CentOS 回顾: Ctrl + Alt + Enter :虚拟机全屏/退出全屏 Ctrl + Alt :释放鼠标 ctrl + shift + "+" : 终端字体放大 ctrl + "-" : 终端字体缩小 ctrl + d:退出终端 ctrl + l : 清屏 ctrl + c : 终止当前命令的执行 ctrl + s : 隐藏终端输出 ctrl + q : 恢复终端输出 init 0 : 关机 init 6 : 重启 pwd:显示当前的路径位置 ls:查看当前位置有什么内容 ls -l :以列表形式显示 ls -a :显示所有内容(包含隐藏) cd:改变当前的工作路径 cd 绝对路径 :cd /home/tarena/aid1806/ cd 相对路径 cd .. :回退到上一级目录 cd :回到用户主目录 mkdir:创建一个或者多个文件 touch:创建一个或者多个文 tree:显示目录树 rm -r : 递归删除文件夹内所有内容 rm -f : 强制删除,不给任何提示 rm -i : 删除前给提示(y代表yes,n代表no) sudo:用超级用户root的权限执行一条命令 tar -zcvf 压缩包名字.tar.gz 文件夹/文件:打包压缩 tar -zxvf 压缩包名字.tar.gz [-C 路径]:解压缩包 z : gzip对包进行压缩 c : 创建包 create x : 解包 v : 显示操作的文件细节 verbose f : 文件名 file cp:复制文件/文件夹 mv:剪切 / 重命名 练习1: 1、切换到目录:/home/tarena/anaconda3/bin 2、查看当前所在的路径 3、以列表形式列出当前路径中所有内容(包含隐藏文件或者目录) 4、切换到当前路径的上一级目录 5、切换到 /etc 目录,查看 /etc 有哪些内容 6、直接切换到用户主目录 答案: tarena@tedu:~$ cd anaconda3/bin/ tarena@tedu:~/anaconda3/bin$ pwd /home/tarena/anaconda3/bin tarena@tedu:~/anaconda3/bin$ ls -la 总用量 27888 drwxrwxr-x 2 tarena tarena 12288 7月 17 2017 . drwxrwxr-x 20 tarena tarena 4096 7月 17 2017 .. lrwxrwxrwx 1 tarena tarena 8 7月 17 2017 2to3 -> 2to3-3.6 -rwxrwxr-x 1 tarena tarena 110 7月 17 2017 2to3-3.6 -rwxrwxr-x 2 tarena tarena 3802 5月 26 2017 activate -rwxrwxr-x 1 tarena tarena 165 7月 17 2017 anaconda -rwxrwxr-x 1 tarena tarena 167 7月 17 2017 anaconda-navigator -rwxrwxr-x 1 tarena tarena 153 7月 17 2017 anaconda-project -rwxrwxr-x 1 tarena tarena 12003 7月 17 2017 asadmin tarena@tedu:~/anaconda3/bin$ cd .. tarena@tedu:~/anaconda3$ cd etc/ tarena@tedu:~/anaconda3/etc$ ls dbus-1 fish fonts jupyter rc.d tarena@tedu:~/anaconda3/etc$ cd 练习2: 1、在用户主目录下创建目录 mydir1 、mydir2 2、在mydir1下创建文件:file1、file2、file3 3、将mydir1打包压缩为mydir1.tar.gz,放在用户主目录下 4、将mydir1.tar.gz剪切到mydir1目录下 5、将mydir1.tar.gz解压缩,放到mydir2目录下(-C选项) 答案: tarena@tedu:~$ mkdir mydir1 mydir2 tarena@tedu:~$ cd mydir1 tarena@tedu:~/mydir1$ touch file1 file2 file3 tarena@tedu:~/mydir1$ cd .. tarena@tedu:~$ tar -zcvf mydir1.tar.gz mydir1 mydir1/ mydir1/file3 mydir1/file1 mydir1/file2 tarena@tedu:~$ ls anaconda3 mydir2 yang 文档 core my_env 公共的 下载 examples.desktop pycharm-2017.1.5 模板 音乐 mydir1 pycharm-professional-2017.1.5.tar.gz 视频 桌面 mydir1.tar.gz PycharmProjects 图片 tarena@tedu:~$ mv mydir1.tar.gz mydir1 tarena@tedu:~$ cd mydir1 tarena@tedu:~/mydir1$ ls file1 file2 file3 mydir1.tar.gz tarena@tedu:~/mydir1$ tar -zxvf mydir1.tar.gz -C ~/mydir2 mydir1/ mydir1/file3 mydir1/file1 mydir1/file2 tarena@tedu:~/mydir1$ cd ~/mydir2 tarena@tedu:~/mydir2$ ls mydir1 tarena@tedu:~/mydir2$ cd mydir1/ tarena@tedu:~/mydir2/mydir1$ ls file1 file2 file3 tarena@tedu:~/mydir2/mydir1$ 练习3: 1、在用户主目录下创建目录:AI/Python/Linux 2、在Linux下创建文件:linux1 、linux2 3、在Python下创建文件:python1 、python2: 4、切换到AI目录,查看当前所在路径 5、直接切换到用户主目录 答案: tarena@tedu:~$ mkdir -p AI/python/linux tarena@tedu:~$ cd AI/python/linux tarena@tedu:~/AI/python/linux$ touch linux1 linux2 tarena@tedu:~/AI/python/linux$ cd .. tarena@tedu:~/AI/python$ touch python1 python2 tarena@tedu:~/AI/python$ cd ~/AI tarena@tedu:~/AI$ cd 练习4: 1、在用户主目录创建如下结构:PYTHON/Linux/day01 2、在 day01 下创建三个文件:day01.txt day02.txt day03.txt 3、将 day03.txt 删除 4、将 day02.txt 文件时间更新为当前时间 5、在用户主目录下创建 python/Base 6、在Base下创建 day01 day02 day03 三个文件夹 7、在day01下创建一个文件 day01.txt 8、删除 python/Base 文件夹内的全部内容 答案: tarena@tedu:~$ mkdir -p PYTHON/linux/day01 tarena@tedu:~$ cd PYTHON/linux/day01 tarena@tedu:~/PYTHON/linux/day01$ touch day01.txt day02.txt day03.ttx tarena@tedu:~/PYTHON/linux/day01$ rm -rf day03.txt tarena@tedu:~/PYTHON/linux/day01$ touch day02.txt tarena@tedu:~/PYTHON/linux/day01$ mkdir -p ~/python/base tarena@tedu:~/PYTHON/linux/day01$ pwd /home/tarena/PYTHON/linux/day01 tarena@tedu:~/PYTHON/linux/day01$ ls day01.txt day02.txt day03.ttx tarena@tedu:~/PYTHON/linux/day01$ cd ~/python/base tarena@tedu:~/python/base$ mkdir day01 day02 day03 tarena@tedu:~/python/base$ cd day01 tarena@tedu:~/python/base/day01$ touch day01.txt tarena@tedu:~/python/base/day01$ cd tarena@tedu:~$ rm -rf python 一、二进制 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 163841 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0=0 1=1 2=10 3=11 4=100 5=101 6=110 7=111 8=1000 9=1001 .... 127=1111111二进制算法= 2**n-1 幂运算-1 · 十进制整数转二进制数:“除以2取余,逆序排列”(除二取 余法) 89÷2 ……1 44÷2 ……0 22÷2 ……0 11÷2 ……1 5÷2 ……1 2÷2 ……0 十进制整数转八进制数: 000 -> 0 | 004-> 4 | 010=8 001 -> 1 |005 -> 5| 011=9 002 -> 2 |006 -> 6 | 012=10 003 -> 3 |007 -> 7 | 013=11 十进制整数转十六进制数: 0000 -> 0 0100 -> 4 1000 -> 8 1100 -> C 0001 -> 1 0101 -> 5 1001 -> 9 1101 -> D 0010 -> 2 0110 -> 6 1010 -> A 1110 -> E 0011 -> 3 0111 -> 7 1011 -> B 1111 -> F 二、编码 Ascll码 255个字符 Ascll码表每个字符统一占用1个字节 Ascll码表不支持中文 支持中文的第一张表 叫GB2312 1980年 GB3212 支持6700+字 1995年 GBK1.0 支持20000字 2000年 GB18030 支持27000字 unicode :万国码 (支持所有国家的编码) 并且一个字符 统一占用2个字节 由于出于它的效率不高,对于存储和传输来说都很耗资源。为了提高Unicode的编码效率,于是就出现了UTF-8编码 UTF-8 、 UTF-8是 unicode的扩展集 英文占一个字节 东南亚 欧洲国家2个字节 中文3个字节 Assic --> GB2312 --> GBK1.0 --> GB18030 --> unicode --> UTF-8 Unicode是可以向下兼容GB2312、GBK 、GB17030而UTF8 重新划分分类和次序 不再是原来的次序编码 #!-*-coding:utf-8 -*- (声明使用utf8编码)#codig:utf-8(声明使用utf8编码) print u“我爱北京天安门?”(u代表转换Unicode格式)转换编码打印

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

Node工程-构建优秀的Session机制

我们公司的大佬 串串,搭建了一套基于koa2的node框架,虽然说是重复造轮子,但适用当前场景的轮子才是最好的,何况很多人还造不出轮子呢~ 大佬搭建的框架命名为 Sponse,其中有很多出色的设计,这里对 session 的设计做个总结(其实是为了自己加深印象,学习大佬的设计) Sponse意思是海绵,而我们这套框架就如同海绵一样,通过不断吸收其他框架的优秀设计丰满自己 cookie 与 session 做开发的小伙伴对这两个应该在熟悉不过了,这两个一起构建起前后端状态的联系,常见的如维护用户登录状态,用户登录后,需要在服务端记录下该用户的登录状态,前端才可以使用需要登录态的接口,此时,浏览器中的 cookie 就是查询用户是否登录的凭证,在服务端,通常是将用户状态信息存储在缓存中,简单说,就是基于 cookie的session 调用方式 优秀的架构中,调用方式必须是友好的 期望能够通过上下文直接调用,如:获取session对象 ctx.session ; 设置session的值 ctx.session.name = name 逻辑图 整体实现逻辑如下 实现 koa提供了操作cookie的api,开箱即用,官方截图如下 缓存基于redis实现 详细代码如下: Session 对象 首先构建一个session对象 核心方法: save 用于同步cookie changed 用于检测session对象是否发生修改,为了同步更新缓存中的值 export class Session { private _ctx; isNew: boolean; _json; // session对象的json串,用于比较session对象是否发生变化 constructor(ctx, obj) { this._ctx = ctx; if (!obj) this.isNew = true; else { for (const k in obj) { this[k] = obj[k]; } } } /** * Save session changes by * performing a Set-Cookie. * * @api private */ save() { const ctx = this._ctx; const json = this._json || JSON.stringify(this.inspect()); const sid = ctx.sessionId; const opts = ctx.cookieOption; const key = ctx.sessionKey; if (ctx.cookies.get(key) !== sid) { // 设置cookies的值 ctx.cookies.set(key, sid, opts); } return json; }; /** * JSON representation of the session. * * @return {Object} * @api public */ inspect() { const self = this; const obj = {}; Object.keys(this).forEach(function (key) { if ('isNew' === key) return; if ('_' === key[0]) return; obj[key] = self[key]; }); return obj; } /** * Check if the session has changed relative to the `prev` * JSON value from the request. * * @param {String} [prev] * @return {Boolean} * @api private */ changed(prev) { if (!prev) return true; this._json = JSON.stringify(this.inspect()); return this._json !== prev; }; } 复制代码 SessionEngine koa中间件 koa 当然是离不开中间件了,洋葱模型酷炫到不行,非常方便的解决了session对象与缓存的同步 decorator(app) { app.keys = ['signed-key']; const CONFIG = { key: app.config.name + '.sess', /** (string) cookie key (default is koa:sess) */ cookie: { // maxAge: 1000, /** (number) maxAge in ms (default is 1 days) */ overwrite: false, /** (boolean) can overwrite or not (default true) */ httpOnly: true, /** (boolean) httpOnly or not (default true) */ signed: true, /** (boolean) signed or not (default true) */ } }; app.use(async (ctx, next) => { let sess: Session; let sid; let json; ctx.cookieOption = CONFIG.cookie; ctx.sessionKey = CONFIG.key; ctx.sessionId = null; // 获取cookie 对应的值, 即sessionID,就是缓存中的key sid = ctx.cookies.get(CONFIG.key, ctx.cookieOption); // 获取session值 if (sid) { try { // 若key存在,则从缓存中获取对应的值 json = await app.redisClient.get(sid); } catch (e) { console.log('从缓存中读取session失败: %s\n', e); json = null; } } // 实例化session if (json) { // 若缓存中有值,则基于缓存中的值构建session对象 ctx.sessionId = sid; try { sess = new Session(ctx, json); } catch (err) { if (!(err instanceof SyntaxError)) throw err; sess = new Session(ctx, null); } } else { sid = ctx.sessionId = sid || Uuid.gen(); sess = new Session(ctx, null); } // 为了便于使用,将session挂载到上下文,这样就可以 ctx.session 这么使用了 Object.defineProperty(ctx, 'session', { get: function () { return sess; }, set: function (val) { if (null === val) return sess = null; if ('object' === typeof val) return sess = new Session(this, val); throw new Error('this.session can only be set as null or an object.'); } }); try { await next(); } catch (err) { throw err; } finally { if (null === sess) { // 设置session=null表示清空session ctx.cookies.set(CONFIG.key, '', ctx.cookieOption); } else if (sess.changed(json)) { // 检查 session 是否发生变化,若有变化,更新缓存中的值 json = sess.save(); await app.redisClient.set(sid, json); app.redisClient.ttl(sid); // 设置redis值过期时间为60分钟 app.redisClient.expire(sid, 7200); } else { // session 续期 app.redisClient.expire(sid, 7200); } } }); 复制代码 小结 多多学习~ 点点进步~ 原文发布时间:2018年06月29日 作者:小黎也 本文来源 掘金如需转载请紧急联系作者

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

Java工程师成神之路

一、基础篇JVM JVM内存结构 堆、栈、方法区、直接内存、堆和栈区别 https://blog.csdn.net/zhangqiluGrubby/article/details/59110906 Java内存模型 内存可见性、重排序、顺序一致性、volatile、锁、final http://www.54tianzhisheng.cn/2018/02/28/Java-Memory-Model/ 垃圾回收 内存分配策略、垃圾收集器(G1)、GC算法、GC参数、对象存活的判定 https://blog.csdn.net/qq_31997407/article/details/79735411 JVM参数及调优 Java对象模型 oop-klass、对象头 https://blog.csdn.net/itachi85/article/details/71159719 HotSpot 即时编译器、编译优化 https://blog.csdn.net/qq_16681169/article/details/72945113 类加载机制 classLoader、类加载过程、双亲委派(破坏双亲委派)、模块化(jboss modules、osgi、jigsaw) 1、一个java文件从被加载到被卸载这个生命过程,总共要经历5个阶段,JVM将类加载过程分为: 加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载 https://blog.csdn.net/eff666/article/details/52203406 虚拟机性能监控与故障处理工具 jps, jstack, jmap、jstat, jconsole, jinfo, jhat, javap, btrace、TProfiler https://blog.csdn.net/yangchangyong0/article/details/78416192 编译与反编译 javac 、javap 、jad 、CRF http://www.cnblogs.com/mingcaoyouxin/p/4164964.html Java基础知识 阅读源代码 String、Integer、Long、Enum、BigDecimal、ThreadLocal、ClassLoader & URLClassLoader、ArrayList & LinkedList、 HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap、HashSet & LinkedHashSet & TreeSet Java中各种变量类型 熟悉Java String的使用,熟悉String的各种函数 JDK 6和JDK 7中substring的原理及区别、 replaceFirst、replaceAll、replace区别、 String对“+”的重载、 String.valueOf和Integer.toString的区别、 字符串的不可变性 自动拆装箱 Integer的缓存机制 熟悉Java中各种关键字 transient、instanceof、volatile、synchronized、final、static、const 原理及用法。 https://segmentfault.com/a/1190000010686246 集合类 常用集合类的使用 ArrayList和LinkedList和Vector的区别 SynchronizedList和Vector的区别 HashMap、HashTable、ConcurrentHashMap区别 http://www.cnblogs.com/binyue/p/4545550.html Java 8中stream相关用法 apache集合处理工具类的使用 http://zhoualine.iteye.com/blog/1770014 不同版本的JDK中HashMap的实现的区别以及原因 https://juejin.im/post/5a5f6d96f265da3e253c31fa 枚举 枚举的用法、枚举与单例、Enum类 Java IO&Java NIO,并学会使用 bio、nio和aio的区别、三种IO的用法与原理、netty http://matt33.com/2017/08/12/java-nio/ Java反射与javassist 反射与工厂模式、 java.lang.reflect.* Java序列化 什么是序列化与反序列化、为什么序列化 序列化底层原理 序列化与单例模式 protobuf 为什么说序列化并不安全 注解 元注解、自定义注解、Java中常用注解使用、注解与反射的结合 https://www.jianshu.com/p/c8655bcca388 JMS 什么是Java消息服务、JMS消息传送模型 JMX java.lang.management.*、 javax.management.* 泛型 泛型与继承 https://www.jianshu.com/p/bd1448352123 类型擦除 泛型中K T V E object等的含义、泛型各种用法 单元测试 junit、mock、mockito、内存数据库(h2) mockito: https://waylau.com/mockito-quick-start/ 正则表达式 java.lang.util.regex.* http://www.runoob.com/regexp/regexp-syntax.html 常用的Java工具库 commons.lang, commons.*... guava-libraries netty 什么是API&SPI 异常 异常类型、正确处理异常、自定义异常 时间处理 时区、时令、Java中时间API 编码方式 解决乱码问题、常用编码方式 语法糖 Java中语法糖原理、解语法糖 Java并发编程 什么是线程,与进程的区别 阅读源代码,并学会使用 Thread、Runnable、Callable、ReentrantLock、ReentrantReadWriteLock、Atomic*、Semaphore、CountDownLatch、、ConcurrentHashMap、Executors Callable: https://www.jianshu.com/p/edd7cb4eafa0 countDownLatch: http://www.importnew.com/15731.html 线程池 自己设计线程池、submit() 和 execute() 线程安全 死锁、死锁如何排查、Java线程调度、线程安全和内存模型的关系 锁 CAS、乐观锁与悲观锁、数据库相关锁机制、分布式锁、偏向锁、轻量级锁、重量级锁、monitor、锁优化、锁消除、锁粗化、自旋锁、可重入锁、阻塞锁、死锁 死锁 volatile happens-before、编译器指令重排和CPU指令重 synchronized synchronized是如何实现的? synchronized和lock之间关系 不使用synchronized如何实现一个线程安全的单例 sleep 和 wait wait 和 notify notify 和 notifyAll ThreadLocal 写一个死锁的程序 写代码来解决生产者消费者问题 守护线程 守护线程和非守护线程的区别以及用法 二、 进阶篇Java底层知识 字节码、class文件格式 CPU缓存,L1,L2,L3和伪共享 尾递归 位运算 用位运算实现加、减、乘、除、取余 设计模式 了解23种设计模式 会使用常用设计模式 单例、策略、工厂、适配器、责任链。 实现AOP 实现IOC 不用synchronized和lock,实现线程安全的单例模式 nio和reactor设计模式 网络编程 tcp、udp、http、https等常用协议 三次握手与四次关闭、流量控制和拥塞控制、OSI七层模型、tcp粘包与拆包 http/1.0 http/1.1 http/2之前的区别 Java RMI,Socket,HttpClient cookie 与 session cookie被禁用,如何实现session 用Java写一个简单的静态文件的HTTP服务器 实现客户端缓存功能,支持返回304 实现可并发下载一个文件 使用线程池处理客户端请求 使用nio处理客户端请求 支持简单的rewrite规则 上述功能在实现的时候需要满足“开闭原则” 了解nginx和apache服务器的特性并搭建一个对应的服务器 用Java实现FTP、SMTP协议 进程间通讯的方式 什么是CDN?如果实现? 什么是DNS? 反向代理 框架知识 Servlet线程安全问题 Servlet中的filter和listener Hibernate的缓存机制 Hiberate的懒加载 Spring Bean的初始化 Spring的AOP原理 自己实现Spring的IOC Spring MVC Spring Boot2.0 Spring Boot的starter原理,自己实现一个starter Spring Security 应用服务器 JBoss tomcat jetty Weblogic 工具 git & svn maven & gradle 三、 高级篇新技术 Java 8 lambda表达式、Stream API、 Java 9 Jigsaw、Jshell、Reactive Streams Java 10 局部变量类型推断、G1的并行Full GC、ThreadLocal握手机制 Spring 5 响应式编程 Spring Boot 2.0 性能优化 使用单例、使用Future模式、使用线程池、选择就绪、减少上下文切换、减少锁粒度、数据压缩、结果缓存 线上问题分析 dump获取 线程Dump、内存Dump、gc情况 dump分析 分析死锁、分析内存泄露 自己编写各种outofmemory,stackoverflow程序 HeapOutOfMemory、 Young OutOfMemory、MethodArea OutOfMemory、ConstantPool OutOfMemory、DirectMemory OutOfMemory、Stack OutOfMemory Stack OverFlow 常见问题解决思路 内存溢出、线程死锁、类加载冲突 使用工具尝试解决以下问题,并写下总结 当一个Java程序响应很慢时如何查找问题、 当一个Java程序频繁FullGC时如何解决问题、 如何查看垃圾回收日志、 当一个Java应用发生OutOfMemory时该如何解决、 如何判断是否出现死锁、 如何判断是否存在内存泄露 编译原理知识 编译与反编译 Java代码的编译与反编译 Java的反编译工具 词法分析,语法分析(LL算法,递归下降算法,LR算法),语义分析,运行时环境,中间代码,代码生成,代码优化 操作系统知识 Linux的常用命令 进程同步 缓冲区溢出 分段和分页 虚拟内存与主存 数据库知识 MySql 执行引擎 MySQL 执行计划 如何查看执行计划,如何根据执行计划进行SQL优化 SQL优化 事务 事务的隔离级别、事务能不能实现锁的功能 数据库锁 行锁、表锁、使用数据库锁实现乐观锁、 数据库主备搭建 binlog 内存数据库 h2 常用的nosql数据库 redis、memcached 分别使用数据库锁、NoSql实现分布式锁 性能调优 数据结构与算法知识 简单的数据结构 栈、队列、链表、数组、哈希表、 树 二叉树、字典树、平衡树、排序树、B树、B+树、R树、多路树、红黑树 排序算法 各种排序算法和时间复杂度 深度优先和广度优先搜索 全排列、贪心算法、KMP算法、hash算法、海量数据处理 大数据知识 Zookeeper 基本概念、常见用法 Solr,Lucene,ElasticSearch 在linux上部署solr,solrcloud,,新增、删除、查询索引 Storm,流式计算,了解Spark,S4 在linux上部署storm,用zookeeper做协调,运行storm hello world,local和remote模式运行调试storm topology。 Hadoop,离线计算 HDFS、MapReduce 分布式日志收集flume,kafka,logstash 数据挖掘,mahout 网络安全知识 什么是XSS XSS的防御 什么是CSRF 什么是注入攻击 SQL注入、XML注入、CRLF注入 什么是文件上传漏洞 加密与解密 MD5,SHA1、DES、AES、RSA、DSA 什么是DOS攻击和DDOS攻击 memcached为什么可以导致DDos攻击、什么是反射型DDoS SSL、TLS,HTTPS 如何通过Hash碰撞进行DOS攻击 用openssl签一个证书部署到apache或nginx 四、架构篇分布式 数据一致性、服务治理、服务降级 分布式事务 2PC、3PC、CAP、BASE、 可靠消息最终一致性、最大努力通知、TCC Dubbo 服务注册、服务发现,服务治理 分布式数据库 怎样打造一个分布式数据库、什么时候需要分布式数据库、mycat、otter、HBase 分布式文件系统 mfs、fastdfs 分布式缓存 缓存一致性、缓存命中率、缓存冗余 微服务 SOA、康威定律 ServiceMesh Docker & Kubernets Spring Boot Spring Cloud 高并发 分库分表 CDN技术 消息队列 ActiveMQ 监控 监控什么 CPU、内存、磁盘I/O、网络I/O等 监控手段 进程监控、语义监控、机器资源监控、数据波动 监控数据采集 日志、埋点 Dapper 负载均衡 tomcat负载均衡、Nginx负载均衡 DNS DNS原理、DNS的设计 CDN 数据一致性 五、 扩展篇云计算 IaaS、SaaS、PaaS、虚拟化技术、openstack、Serverlsess 搜索引擎 Solr、Lucene、Nutch、Elasticsearch 权限管理 Shiro 区块链 哈希算法、Merkle树、公钥密码算法、共识算法、Raft协议、Paxos 算法与 Raft 算法、拜占庭问题与算法、消息认证码与数字签名 比特币 挖矿、共识机制、闪电网络、侧链、热点问题、分叉 以太坊 超级账本 人工智能 数学基础、机器学习、人工神经网络、深度学习、应用场景。 常用框架 TensorFlow、DeepLearning4J 其他语言 Groovy、Python、Go、NodeJs、Swift、Rust 六、 推荐书籍 《深入理解Java虚拟机》 《Effective Java》 《深入分析Java Web技术内幕》 《大型网站技术架构》 《代码整洁之道》 《Head First设计模式》 《maven实战》 《区块链原理、设计与应用》 《Java并发编程实战》 《鸟哥的Linux私房菜》 《从Paxos到Zookeeper》 《架构即未来》 文章摘自: http://www.hollischuang.com/archives/489 http://www.hollischuang.com/archives/1001

资源下载

更多资源
Nacos

Nacos

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册