问: 我有一个调用自己的函数: def get_input(): my_var = input('Enter "a" or "b": ') if my_var !...: Type "a" or "b": a got input: a 但是,如果我输入别的东西,然后输入 "a" 或 "b",我会得到这样的结果: Type "a" or "b": purple You...Type "a" or "b": a got input: None 我不明白为什么 get_input() 函数返回的是 None,因为它本应只返回 my_var。这个 None 是从哪里来的?...我该如何修复我的函数呢? 答: 它返回 None 是因为当你递归调用它时: if my_var != "a" and my_var !...Python3 documentation 因此,除了在 if 语句中调用 get_input() 之外,还需要返回递归调用返回的内容。
self 自动指向方法的调用者,调用时不用手动提供 self 的值。...python 中操作 excel 的库有很多,可参考我们之前的介绍文章:Python-Excel 模块哪家强?...不过它相当于是 windows COM 的封装,自身并没有很完善的文档,新手使用起来略有些痛苦。...另外详细介绍 xlrd、xlwt、xlutils 库的文章:Python 与 Excel 不得不说的事 3 搜索引擎该如何正确使用?...正确地使用搜索引擎是学习编程的必备技能,用好 Google 或者 Baidu 也有很多技巧:编程初学者如何使用搜索引擎
,它的锁粒度非常大,和所有其他锁冲突,所以给生产环境表加索引的时候非常容易出现被阻塞的现象。...正确的加字段或者索引姿势 尽量业务低峰期操作 原因1:上一章节讲到,加字段和加索引操作会伴随着数据拷贝动作,会导致操作系统IO或者负载变高,在业务高峰期可能会影响性能; 原因2:Alter Table操作会拿表级排它锁...,排它锁会阻塞其他访问该表的SQL操作,造成业务请求堆积,大量请求堆积可能导致连接数上涨、实例负载升高等问题; 使用CONCURRENTLY关键字 使用CONCURRENTLY加索引时,持有锁降为ShareUpdateExclusiveLock...所有访问数据请求都停掉了,为什么还会有锁冲突? 既然DDL操作这么难,那么我停业务后再执行总不会受其他操作影响了吧?...stone=# insert into test(id,text) select i,'text:'||i from generate_series(1,10000000) as i; INSERT 0
这是典型的C语言中函数模块中的返回值问题,算是常见的语法细节,很多人觉得C语言已经过时了,只能代表着这类人还不算是真正的技术人员,在嵌入式领域C语言依然充当着非常重要的角色,C语言在很多领域还是首选编程语言...具体功能实现,最后是结果的输出,也就是这个题目的返回值,在正常情况下函数的返回值只有一个,但在实际编程中需要用到多个,在设计时候还是归结成一类,如果类型相近可以弄成数组方式,如果类型不太一致直接放在结构体中执行...,如果函数返回值是个指针的话,就能把整个结构体里面的内容返回出来,同样能够达到返回多个数值的作用,这种在平常的编程过程中用的最多,C语言中使用最频繁的关键点就是指针了,但也是很多初学者最不好理解的知识点...C语言中如果掌握了结构体和指针基本上C语言将近一半的知识点就拿下了,当然直接返回结构体指针的方式属于非常常见的编程方式。 ?...3.数组指针返回 指向数组的指针,既然是数组就可以在里面放入多个数值,同样可以起到返回多个数值的作用,其实这点和结构体指针效果差不多,只不过数值存放的位置不同。
调用Thread类的方法:public final String getName() 为什么得到的线程对象的名称默认是:Thread-0、Thread-1、Thread-2、...呢?...是传递进来的name,是由"Thread-" + nextThreadNum()得到的name,nextThreadNum()方法第一次返回的是0,第二次返回的是1,... ......() { return threadInitNumber++; // 0, 1 注意:是后++ nextThreadNum()方法第一次返回的是0,第二次返回的是1,.....,就会去父类thread 调用位无参构造,而父类的无参构造是一系列的init() 方法,最终得到 Thread-0,启动线程后,再通过Thread类的getName()方法得到线程对象的名称。...-1,启动线程后,再通过Thread类的getName()方法得到线程对象的名称。
但是如果我想得到 target 的左侧边界,即索引 1,或者我想得到 target 的右侧边界,即索引 3,这样的话此算法是无法处理的。 这样的需求很常见。...但是如果我想得到 target 的左侧边界,即索引 1,或者我想得到 target 的右侧边界,即索引 3,这样的话此算法是无法处理的。 这样的需求很常见。...综上可以看出,函数的返回值(即 l 变量的值)取值区间是闭区间 [0, len(nums)],所以我们简单添加两行代码就能在正确的时候 return -1: while l < h: #......为什么最后返回 l - 1 而不像左侧边界的函数,返回 l?而且我觉得这里既然是搜索右侧边界,应该返回 h 才对。...答:类似之前的左侧边界搜索,因为 while 的终止条件是 l == h,就是说 l 的取值范围是 [0, len(nums)],所以可以添加两行代码,正确地返回 -1: while l < h: #
我第一次见到这个算法问题是谷歌的一道算法题:给你一个未知长度的链表,请你设计一个算法,只能遍历一次,随机地返回链表中的一个节点。...一般的想法就是,我先遍历一遍链表,得到链表的总长度n,再生成一个[1,n]之间的随机数为索引,然后找到索引对应的节点,不就是一个随机的节点了吗? 但题目说了,只能遍历一次,意味着这种思路不可行。...这种问题的关键在于证明,你的算法为什么是对的?...比如给你一个数组w,每个元素w[i]代表权重,请你写一个算法,按照权重随机抽取索引。比如w = [1,99],算法抽到索引 0 的概率是 1%,抽到索引 1 的概率是 99%。...2、实现一个生成器类,构造函数传入一个很长的数组,请你实现randomGet方法,每次调用随机返回数组中的一个元素,多次调用不能重复返回相同索引的元素。
你要是没有正确理解这些细节,写二分肯定就是玄学编程,有没有 bug 只能靠菩萨保佑。我特意写了一首诗来歌颂该算法,概括本文的主要内容,建议保存: ?...一、寻找一个数(基本的二分搜索) 这个场景是最简单的,可能也是大家最熟悉的,即搜索一个数,如果存在,返回其索引,否则返回 -1。...所以这时候 for 循环终止是正确的,直接返回 -1 即可。...但是如果我想得到 target 的左侧边界,即索引 1,或者我想得到 target 的右侧边界,即索引 3,这样的话此算法是无法处理的。...综上可以看出,函数的返回值(即 left 变量的值)取值区间是闭区间 [0, nums.length],所以我们简单添加两行代码就能在正确的时候 return -1: if left == len
O(N),而且逻辑很简单,关键在于让你证明为什么这样做是正确的。...我第一次见到这个算法问题是谷歌的一道算法题:给你一个未知长度的单链表,请你设计一个算法,只能遍历一次,随机地返回链表中的一个节点。...一般的想法就是,我先遍历一遍链表,得到链表的总长度n,再生成一个[0,n-1)之间的随机数为索引,然后找到索引对应的节点。但这不符合只能遍历一次链表的要求。...对于洗牌算法中的shuffle函数也可以采取类似的验证方法,我们可以跟踪某一个元素x被打乱后的索引位置,如果x落在各个索引的次数基本相同,则说明算法正确,你可以自己尝试实现,我就不贴代码验证了。...比如w = [1,99],算法抽到索引 0 的概率是 1%,抽到索引 1 的概率是 99%,答案见 我的这篇文章。
但是如果我想得到 target 的左侧边界,即索引 1,或者我想得到 target 的右侧边界,即索引 3,这样的话此算法是无法处理的。 这样的需求很常见。...while(left < right) 终止的条件是 left == right,此时搜索区间 [left, left) 为空,所以可以正确终止。 2. 为什么没有返回 -1 的操作?...综上可以看出,函数的返回值(即 left 变量的值)取值区间是闭区间 [0, nums.length],所以我们简单添加两行代码就能在正确的时候 return -1: while (left < right...为什么最后返回 left – 1 而不像左侧边界的函数,返回 left?而且我觉得这里既然是搜索右侧边界,应该返回 right 才对。...答:类似之前的左侧边界搜索,因为 while 的终止条件是 left == right,就是说 left 的取值范围是 [0, nums.length],所以可以添加两行代码,正确地返回 −1: while
你要是没有正确理解这些细节,写二分肯定就是玄学编程,有没有 bug 只能靠菩萨保佑。我特意写了一首诗来歌颂该算法,概括本文的主要内容,建议保存: ? 你等会看完本文再回来读读,就有味道了。...但是如果我想得到target的左侧边界,即索引 1,或者我想得到target的右侧边界,即索引 3,这样的话此算法是无法处理的。...综上可以看出,函数的返回值(即left变量的值)取值区间是闭区间[0, nums.length],所以我们简单添加两行代码就能在正确的时候 return -1: while (left < right)...2、为什么最后返回left - 1而不像左侧边界的函数,返回left?而且我觉得这里既然是搜索右侧边界,应该返回right才对。...答:类似之前的左侧边界搜索,因为 while 的终止条件是left == right,就是说left的取值范围是[0, nums.length],所以可以添加两行代码,正确地返回 -1: while (
但是如果我想得到 target 的左侧边界,即索引 1 2,或者我想得到 target 的右侧边界,即索引 3 3,这样的话此算法是无法处理的。 这样的需求很常见。...while(left < right) 终止的条件是 left == right,此时搜索区间 [left, left) 为空,所以可以正确终止。 为什么没有返回 -1 的操作?...综上可以看出,函数的返回值(即 left 变量的值)取值区间是闭区间 [0, nums.length],所以我们简单添加两行代码就能在正确的时候 return -1: while (left < right...为什么最后返回 left - 1 而不像左侧边界的函数,返回 left?而且我觉得这里既然是搜索右侧边界,应该返回 right 才对。...答:类似之前的左侧边界搜索,因为 while 的终止条件是 left == right,就是说 left 的取值范围是 [0, nums.length],所以可以添加两行代码,正确地返回 −1 while
对 NULL 的判断只能定性,而不能定值。...因此选择了在排序的时候将0转化为 NULL 的方法,这样利用排序时 NULL 最大的原理,得到了希望的结果。 0确实排在了最后,但是返回结果并不正确,15居然排在了8的前面。...(字符类型结果在 SQLPLUS 显示左对齐,而数值类型是右对齐),可是现在处理的是数值类型,为什么会得到字符类型的输出呢。...Oracle 的优化器在确定是否使用索引的时候,第一标准是能否得到一个正确的结果。由于OBJECT_ID 是可以为空的,而索引列不包含为空的记录。...因此通过索引扫描无法得到一个正确的结果,这就是 SELECT COUNT(*) FROM T 不会使用 OBJECT_ID 上的索引的原因。
你要是没有正确理解这些细节,写二分肯定就是玄学编程,有没有 bug 只能靠菩萨保佑。我特意写了一首诗来歌颂该算法,概括本文的主要内容,建议保存: 你等会看完本文再回来读读,就有味道了。...但是如果我想得到target的左侧边界,即索引 1,或者我想得到target的右侧边界,即索引 3,这样的话此算法是无法处理的。...综上可以看出,函数的返回值(即left变量的值)取值区间是闭区间[0, nums.length],所以我们简单添加两行代码就能在正确的时候 return -1: while (left < right)...2、为什么最后返回left - 1而不像左侧边界的函数,返回left?而且我觉得这里既然是搜索右侧边界,应该返回right才对。...答:类似之前的左侧边界搜索,因为 while 的终止条件是left == right,就是说left的取值范围是[0, nums.length],所以可以添加两行代码,正确地返回 -1: while (
但是如果我想得到 target 的左侧边界,即索引 1,或者我想得到 target 的右侧边界,即索引 3,这样的话此算法是无法处理的。 这样的需求很常见。...while(left < right) 终止的条件是 left == right,此时搜索区间 [left, left) 恰巧为空,所以可以正确终止。 2. 为什么没有返回 -1 的操作?...综上可以看出,函数的返回值(即 left 变量的值)取值区间是闭区间 [0, nums.length],所以我们简单添加两行代码就能在正确的时候 return -1: while (left < right...为什么最后返回 left - 1 而不像左侧边界的函数,返回 left?而且我觉得这里既然是搜索右侧边界,应该返回 right 才对。...答:类似之前的左侧边界搜索,因为 while 的终止条件是 left == right,就是说 left 的取值范围是 [0, nums.length],所以可以添加两行代码,正确地返回 -1: while
很大一部份程序员对索引的了解仅限于到“加索引能使查询变快”这个概念为止。 为什么要给表加上主键? 为什么加索引后会使查询变快? 为什么加索引后会使写入、修改、删除变慢?...,同样使用的索引的人难到会不知道,通过索引定位到数据比直接一条一条的查询来的快,不然他们为什么要建索引。...这就是为什么一个表只能有一个主键, 一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。 ? 上图就是带有主键的表(聚集索引)的结构图。...破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销,也就是为什么索引会给查询以外的操作带来副作用的原因。...等于1991-11-1的所有记录的主键ID值 然后,通过得到的主键ID值执行聚集索引查找,找到主键ID值对就的真实数据(数据行)存储的位置 最后, 从得到的真实数据中取得user_name字段的值返回,
class regx { public static function check($str) { if(preg_match("/^([1-9,])+...
领取专属 10元无门槛券
手把手带您无忧上云