# 图片太多,详细见link 以及文本
31 May 18
一、今日面试及知识点回顾
1、%和format的区别?
Python中字符串的格式化(%、format),你一般用哪种?为什么?
- 简单的用%,超过两个值一般都用format
https://www.cnblogs.com/liwenzhou/p/8570701.html
定义一个敌人的坐标
c = (250, 250)
利用%进行字符串格式化
print("向他开炮:%s" % c) # 报错not all arguments converted during string formatting
print("向他开炮:%s" % (c, )) # 向他开炮:(250, 250)
用format进行字符串的格式化
print("向他开炮:{}".format(c)) # 向他开炮:(250, 250)
在python3.6中加入的f-strings新特性
format的常见用法
通过位置
l1 = ["Egon", 18]
s = "{} is {} years old.".format(l1[0], l1[1]) # Egon is 18 years old.
s = "{} is {} years old.".format(*l1) # Egon is 18 years old.
print(s)
通过关键字
d1 = {"name": "Egon", "age": 18}
s = "{name} is {age} years old.".format(**d1) # Egon is 18 years old.
print(s)
通过对象属性
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return "{self.name} - {self.age}".format(self=self)
p1 = Person("Egon", 18) # Egon - 18
print(p1)
通过下标
l1 = ["Egon", 18]
s = "{} is {} years old. {} 不要脸。".format(l1[0], l1[1], l1[0]) # Egon is 18 years old. Egon 不要脸。
s = "{0} is {1} years old. {0} 不要脸。".format(l1[0], l1[1]) # Egon is 18 years old. Egon 不要脸。
s = "{0[0]} is {0[1]} years old. {0[0]} 不要脸。".format(l1) # Egon is 18 years old. Egon 不要脸。
print(s)
填充与对齐
print("egon".center(20, "*")) # 居中********egon********
print("{:>10}".format("egon")) # 右对齐 共10 egon
print("{:0>10}".format("egon")) # 右对齐 共10 用0填充000000egon
print("{:*>10}".format("egon")) # 右对齐 共10 用*填充******egon
print("{:*^10}".format("egon")) # 居中 共10 用*填充***egon***
print("{:*<10}".format("egon")) # 左对齐 共10 用*填充egon******
print("egon".zfill(18)) # 默认右对齐 共18 用0填充00000000000000egon
精度与类型f
print("{:.2f}".format(3.141592653)) # 两位小数3.14
其他进制
print("{:b}".format(10)) # 二进制1010
print("{:d}".format(10)) # 十进制10
print("{:o}".format(10)) # 八进制12
print("{:x}".format(10)) # 十六进制a
千位分隔符
print("{:,}".format(1000000)) # 用,每三位分隔1,000,000
2、python中json序列化相关操作
import json
# 序列化 python对象-> JSON格式的字符串
d = {"name": "Egon", "age": 18}
ret = json.dumps(d)
print(ret, type(ret)) # {"name": "Egon", "age": 18} <class 'str'>
# 反序列化JSON格式的字符串-> Python对象
p_str = '{"name": "Egon", "age": 18}'
d2 = json.loads(p_str) # {'name': 'Egon', 'age': 18} <class 'dict'>
print(d2, type(d2))
3、正则表达式复习
https://q1mi.github.io/PythonBlog/post/about_re/
二、上节课知识补充(sort)
关于sort()需要注意:
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数a 和b,其返回值如下:
若a 小于b,在排序后的数组中a 应该出现在b 之前,则返回一个小于0 的值。
若a 等于b,则返回0。
若a 大于b,则返回一个大于0 的值。
三、词法分析
JavaScript中在调用函数的那一瞬间,会先进行词法分析。
词法分析的过程:
当函数调用的前一瞬间,会先形成一个激活对象:Avtive Object(AO),并会分析以下3个方面:
1:函数参数,如果有,则将此参数赋值给AO,且值为undefined。如果没有,则不做任何操作。
2:函数局部变量,如果AO上有同名的值,则不做任何操作。如果没有,则将此变量赋值给AO,并且值为undefined。
3:函数声明,如果AO上有,则会将AO上的对象覆盖。如果没有,则不做任何操作。
函数内部无论是使用参数还是使用局部变量都到AO上找。
四、自定义对象(类似python中的字典)
JavaScript的Object本质上是键值对的集合(Hash结构),但是只能用字符串作为键,如果没有输入字符串,会将输入转化成字符串,如下。
当已知key时,可用以下两种方式将对应数值取出
var a = {"name": "Alex", "age": 18};
console.log(a.name);
console.log(a["age"]);
遍历对象中的内容
var a = {"name": "Alex", "age": 18};
for (var i in a){
console.log(i, a[i]); # 不能用a.i,只能用a[i]
}
五、Date对象(重要)
创建Date对象
# 注意: 月份是0-11
Date对象的办法
// 编写JS文件,将当前日期按“2017-12-27 11:11 星期三”格式输出。
const WEEKMAP = {
0: "星期日",
1: "星期一",
2: "星期二",
3: "星期三",
4: "星期四",
5: "星期五",
6: "星期六",
};
function showTime() {
var d1 = new Date();
var year = d1.getFullYear();
var month = d1.getMonth() + 1;
var day = d1.getDate();
var hour = d1.getHours();
var minute = d1.getMinutes() < 10 ? "0"+d1.getMinutes() :d1.getMinutes();
var week = WEEKMAP[d1.getDay()]; // 0~6的星期
var dateStr = `
${year}-${month}-${day} ${hour}:${minute} ${week}
`;
console.log(dateStr)
alert (date)
}
showTime();
六、Json对象(重要)
1. JSON.parse() 字符串-> JS对象
2. JSON.stringify() JS对象-> 字符串
七、RegExp对象(重要)
Python正则表达式相关:https://q1mi.github.io/PythonBlog/post/about_re/
1. 两种方式
1. var reg1 = new RegExp('[a-zA-Z][a-zA-Z0-9]{5,11}')
#一位字母+5-11位字母或数字
2. var reg2 = /[a-zA-Z][a-zA-Z0-9]{5,11}/
RegExp对象的test方法,测试一个字符串是否符合对应的正则规则,返回值是true或false
2. 三个坑
1. 不要加空格
- 全局模式g不要乱用
// 注意事项1:
// 如果regExpObject带有全局标志g,test()函数不是从字符串的开头开始查找,而是从属性regExpObject.lastIndex所指定的索引处开始查找。
// 该属性值默认为0,所以第一次仍然是从字符串的开头查找。
// 当找到一个匹配时,test()函数会将regExpObject.lastIndex的值改为字符串中本次匹配内容的最后一个字符的下一个索引位置。
// 当再次执行test()函数时,将会从该索引位置处开始查找,从而找到下一个匹配。
// 因此,当我们使用test()函数执行了一次匹配之后,如果想要重新使用test()函数从头开始查找,则需要手动将regExpObject.lastIndex的值重置为0。
// 如果test()函数再也找不到可以匹配的文本时,该函数会自动把regExpObject.lastIndex属性重置为0。
3. test()不传值相当于传undefined,会按照'undefined'处理
String对象与正则结合的4个方法
var s2 = "hello world";
s2.match(/o/g); // ["o", "o"] 查找字符串中 符合正则 的内容
s2.search(/h/g); // 0 查找字符串中符合正则表达式的内容位置
s2.split(/o/g); // ["hell", " w", "rld"] 按照正则表达式对字符串进行切割
s2.replace(/o/g, "s"); // "hells wsrld" 对字符串按照正则进行替换
# g: 全局匹配i:不区分大小写
八、Math
abs(x) 返回数的绝对值。
exp(x) 返回e 的指数。
floor(x) 对数进行下舍入。
log(x) 返回数的自然对数(底为e)。
max(x,y) 返回x 和y 中的最高值。
min(x,y) 返回x 和y 中的最低值。
pow(x,y) 返回x 的y 次幂。
random() 返回0 ~ 1 之间的随机数。
round(x) 把数四舍五入为最接近的整数。
sin(x) 返回数的正弦。
sqrt(x) 返回数的平方根。
tan(x) 返回角的正切。
九、BOM(Browser Object Model)
http://www.cnblogs.com/liwenzhou/p/8011504.html
BOM为浏览器对象模型,它使JavaScript 有能力与浏览器进行“对话”。
Window对象是客户端JavaScript最高层对象之一,由于window对象是其它大部分对象的共同祖先,在调用window对象的方法和属性时,可以省略window对象的引用。例如:window.document.write()可以简写成:document.write()。
1. location对象
location.href --> 获取当前访问的URL
location.href = "具体的URL" --> JS代码控制浏览器跳转到具体的URL
location.reload() --> 重新加载当前页面
2. var t = setTimeout(要做的事儿, 毫秒数) --> 多少毫秒之后做什么事儿
clearTimeout(t)
var t = setInterval(要做的事儿, 毫秒数) --> 每隔多少毫秒就做什么事儿
clearInterval(t)
清除定时器示例
3. 其他
# js不能关闭用户打开的浏览器
window.open() -打开新窗口
window.close()- 关闭当前窗口