Python 每日一题-杂记

中文Python教程

https://yiyibooks.cn/xx/python_352/tutorial/index.html

@所有人
每日一题-Day1
=======
Python有哪些基本的数据类型?和你所熟悉的编程语言有哪些区别?

答案:内置的数据类型有int float complex str bool None,dict tuple list set
前面是元素类型后面是集合类型,元素类型都是immutable的,集合类型中tuple类型是immutable的,其他的都是mutable的.


@所有人
每日一题
=======
什么叫可变对象?什么叫不可变对象?Python中哪些对象是可变的?哪些是不可变的?

答案:

  • 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。
  • 可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。

Python中,数值类型(int和float)、字符串str、元组tuple都是不可变类型。而列表list、字典dict、集合set是可变类型。


@所有人
每日一题
=======
如果一个女生说,她集齐了十二个星座的前男友,我们应该如何估计她前男友的数量?

Hint:
1.可以先用自己顺手的语言解决,再重构为Python代码
2.可以通过概率统计的公式解决,也可以通过蒙特卡洛算法处理
3.可以适当假定某些限制条件,简化问题,抽象出问题模型


@所有人
每日一题
=======
a = [1,2,3] b = [2,3] c = list(zip(a,b)) 简单解释下c


@所有人
每日一题
=======
打印九九乘法表


@所有人
每日一题
=======
一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?(10000内查找该数)


@所有人
每日一题
=======
有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在A、B、C三人额头上贴任意两张牌,
A、B、C三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,
A说不知道,B说不知道,C说不知道,然后A说知道了。
请教如何推理,A是怎么知道的。
如果用程序,又怎么实现呢?

color_combination = [['red','blue'],['red','red'],['blue','blue']]

for teacher in color_combination:
    for A in color_combination:
        for B in color_combination:
            for C in color_combination:
                if not (A[0]==A[1]==B[1]==B[0]) \
                and not (A[0]==A[1]==C[1]==C[0])\
                and not (B[0]==B[1]==C[1]==C[0])\
                and [teacher[0],teacher[1],A[0],A[1],B[0],B[1],C[0],C[1]].count('blue')==4\
                and [teacher[0],teacher[1],A[0],A[1],B[0],B[1],C[0],C[1]].count('red')==4\
                and A[0]!=A[1]:
                    print(teacher,A,B,C)

每日一题

Fizz Buzz
输出一个列表,从1记录到n,总长度为n,但是里面的元素有以下特征
全部都是string格式
如果元素是3的倍数,输出“Fizz”;
如果元素是5的倍数,输出“Buzz”;
如果元素同时是3和5的倍数,输出 “FizzBuzz”。
示例:
input: 8
output:
["1","2","Fizz","4", "Buzz","Fizz","7","8"]

每日一题

写一个函数,计算斐波那契数列

每日一题

写一个闭包的例子,并说说闭包的两个特点。

特点:1. 闭包由函数内的函数构造 2. 闭包函数的变量跟随函数的环境存在(跟随实例)

每日一题

Question:

有a,b,c,d四名犯罪嫌疑人,其中有一人是小偷,审讯中:

a说我不是小偷;

b说c是小偷;

c说小偷肯定是d;

d说c胡说!

其中有三个人说的是实话,一个人说的是假话,请推断谁是小偷

for thief in ('a', 'b', 'c', 'd'):
sum = ('a' != thief) + (thief == 'c') + (thief == 'd') + (thief != 'd')
if sum == 3:
print("thief is %s"%thief)

2019.2.16
老师,Python中类属性的3P定义,似乎是以属性变量名前缀所带的下划线个数决定的吗?
比如 self.var 是 public,self._var 是 protect, self.__var 是 private ? -- 是的, 用来决定类外对变量访问的权限

foo: 定义的是特殊方法,一般是系统定义名字 ,类似 init() 之类的。
_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
foo:就是public方法

有关变量作用域:

函数体内可以引用全局变量。全局变量,如果是可变的话,是传引用,如果是不可变的,是传值。函数可以没有参数

变量作用域遵循LEGB法则,也就是说在函数定义域内,不能重新再定义这个变量,不管它是可变的,还是不可变的,如果你重新定义的话,它就会用局部作用域当中这个变量,如果你不重新定义它,直接引用函数体外面的那个变量。

LEGB Local Encloser Global Builtins

手机练习Python:

如果希望用手机随时随地编写练习Python语法, 使用PyDroid见文件:pydroid.apk

网页版运行Python代码的网站
https://tool.lu/coderunner/

Code编辑器:

Plain Text Editor:记事本
Command Line Editor:vim、emacs、nano
Editor:Sublime Text、Notepad++、Atom、VS Code、Eclipse
IDE:Anaconda、PyCharm

解释器+编辑器:解释器是用来解释python代码的,也就是运行代码的;其他的都是编辑器,都是用来写代码的,现在说到的都是编辑器,就跟用txt和用word或者用pages写文章一样

一篇关于sublime详细的配置文章,如何装插件。
有学习成本的https://zhuanlan.zhihu.com/p/52524895

新手建议安装Anaconda,用Jupyter notebook做项目,Spyder和Jupyter notebook也可以配置黑色背景

spyder里:
用快捷键Alt +Shift+PageDown切换下一个布局

有关twisted

安装命令:
conda install twisted

为什么需要: twisted

  • Twisted是用Python实现的基于事件驱动的网络引擎框架
  • 单线程异步

补充例子2:Python3中的C3算法:多继承查找规则

mro公式:
mro(Child(Base1,Base2)) = [Child] + merge(mro(Base1), mro(Base2), [Base1, Base2])
(其中Child继承自Base1, Base2)

merge函数的规则是表头的元素如果只出现在其他父类的继承顺序的表头或者不出现在其他父类中则取出来放顺延加在继承顺序表里,其他情况则跳过此父类,向搜索!

mro(A(B, C)) = [A] + merge(mro(B(D, E)) + mro(C(E, F)) + [B, C])
= [A] + merge([B] + merge(mro(D) + mro(E) + [D, E]) + [C] + merge(mro(E) + mro(F) + [E, F]) + [B, C])
= [A] + merge([B] + merge([D] + [E] + [D, E]) + [C] + merge([E] + [F] + [E, F]) + [B, C])
= [A] + merge([B] + [D, E]) + [C] + [E, F] + [B, C])
= [A] + merge([B, D, E] + [C, E, F] + [B, C])
= [A] + [B] + [D] + merge([E] + [C, E, F] + [C])
= [A, B, D] + [C] + merge([E] + [E, F])
= [A, B, D, C, E, F, O] # 最后添加上O

最后给大家出一个趣味题用做知识点的复习和回顾:
这个题目最开始出的时候大家觉得困难,现在重新思考一下:
“如果一个女生说,她集齐了十二个星座的前男友,我们应该如何估计她前男友的数量?”

Hint:

蒙特卡洛算法处理

可以适当假定某些限制条件,简化问题,抽象出问题模型

杭州 互联网: 应该假设 女孩没有星座偏好 男孩出生的时间在一年内均匀分布 」


棒!上道了~

假设这个女生交往的男性星座符合均匀分布,就是说每个星座的人数一致

2、假设女生对男生的星座没有特殊偏好,比如不存在天生就特别不喜欢处女座;且上一任的星座不会影响下一任的星座,比如不会存在交往了天蝎座就不敢再和天蝎座交往

3、假设被研究对象每次分手后的下一次交往,星座仍符合均匀分布;假如一个女生周围的12星座男生各四个,那么它交往了某个星座,这个星座就少了一个,下次选择的时候概率不均匀,假设魅力值无限,周围所有星座的男生数量无限;

「 zy: 要考虑先后吗 能不能当做女孩要同时交往多少男生则比较容易集齐12星座


不考虑先后,可以

你可能感兴趣的:(Python 每日一题-杂记)