列表的基本操作

看了看Github,上个commit还在17天前,不能这么废下去……

列表的基本操作

列表,可能不那么顾名思义,就是把一堆东西扔到一个表里……这个笑话有点冷。

与某些语言的数组不同,Python的列表是不要求数据类型相同的,有需要的话,str、int、float都可以往一个列表里塞。同样的,列表的创建方法也与变量赋值无异,例如:

>>> number = ['a',1,1.5]
>>> number
['a', 1, 1.5]

添加元素

向列表中添加元素主要有三种方法:一种是使用append方法,一种是使用extend方法,还有insert方法。

appendextend方法的区别在于,append是将内容作为一个元素添加到最后,而extend是用一个列表来扩展另一个列表。

>>> list = [1,2,3,4]
>>> list.append(5)
>>> list
[1, 2, 3, 4, 5]
>>> list.extend([6])
>>> list
[1, 2, 3, 4, 5, 6]
>>> list.append([1,2,3])
>>> list
[1, 2, 3, 4, 5, 6, [1, 2, 3]]
>>> list.extend([1,2,3])
>>> list
[1, 2, 3, 4, 5, 6, [1, 2, 3], 1, 2, 3]

insert方法可以将一个元素插入到列表的中间。语法为(index,object),注意从0开始数。

>>> list = [1,2,3]
>>> list.insert(2,'a')
>>> list
[1, 2, 'a', 3]

获取元素

与字符串类似,获取元素可以使用name[n]

>>> list = [1,2,3]
>>> list[1]
2

类似的,获取列表中的列表的元素,那就再加一个[n]。

>>> list = [1,2,3,[1,2,3]]
>>> list[3][0]
1

也可以用于快速交换元素位置,比如:

>>> list=[1,2,3,4]
>>> list[0],list[2] = list[2],list[0]
>>> list
[3, 2, 1, 4]

删除元素

删除元素可以使用remove方法或者delremove方法根据值来删除元素,del可以按位置删除元素,也可删除整个列表(或是说变量)。

>>> list = ['a',1,'b',2]
>>> list.remove('a')
>>> list
[1, 'b', 2]
>>> del list[0]
>>> list
['b', 2]

另外可以用pop方法,pop可以“取出”列表中的元素。

>>> list = [1,2,3,4]
>>> list.pop()
4
>>> list
[1, 2, 3]
>>> list.pop(1)
2
>>> list
[1, 3]

 

一次失败的双显卡折腾记

近日购入了一款4K显示器,被高PPI所震撼的同时却发现系统相当卡顿,连鼠标移动都有一种迟滞感,检查显示设置后,发现刷新率被锁定在了30Hz。

在购买显示器之前,我已经在Intel ARK上查询过HD530是支持[email protected]输出的。显然问题并不出在这里。网上搜索发现,HDMI 2.0 才支持[email protected],由于特意购买了标明支持[email protected]的线材,所以问题只可能出在主板上。

然而华擎的产品页面没一个地方写了主板的HDMI到底是1.4还是2.0,找了好久才发现有一行小字写着最大分辨率3840×[email protected],妥妥的没戏。

核显用不成,那就买独显吧。找了一圈,支持[email protected]输出的亮机卡性价比较高的就是GT640 OEM了,遂下单购买。

到货之后测试发现并不能点亮,在用Ubuntu Live测试之后排除显卡问题,开始漫长的排错之旅。

首先说下硬件情况,由于将第一块独显——RX480用PCI Passthrough 分配给了虚拟机,宿主机一直是用核显的。外加另一块独显之后,状态就是PCI-E插槽1是RX480,插槽2是GT640。主要图形适配器之前一直设为核显,此时改为使用PCI Express。

在开机之后,会在RX480的显示器上打印POST信息,进入GRUB,启动内核。这时RX480上的显示器会停止输出,因为在启动内核过程中RX480就会被vfio接管,这是预期之内的。但接在GT640上的显示器却一直是有信号但是黑屏的状态。

关闭IOMMU,用RX480作为主GPU进入系统,可以看到显卡已经被正确识别,nouveau模块也被正确加载。系统也已经检测到了GT640上的监视器,但无论如何设置都是没有图像。dmesgjournalctl也没有输出什么有用的信息。

这时只好采用终极排错法——一个一个试。把RX480拔下来只留GT640,虽然Xorg有一些问题,但至少能看见图形界面并且tty一切正常。只留RX480,同样一切正常。(补充:N卡的问题是因为最近版本的nouveau的bug)

还排查不出来那就再换个方法,交换两块显卡的位置,虽然Xorg仍然无法启动但tty已经可以进入。查看Xorg的日志之后发现Xorg无法找到正确的监视器,不过还好,至少Xorg是可以手动配置的。

但将GT640插在插槽1,RX480插在插槽2对我来说是不可接受的。原因有二:

  1. 只有插槽1是直连CPU的,插槽2则会绕道PCH,性能有损失。外加插槽2会和板载的一堆东西分在一个IOMMU组里面,想要使用PCI Passthrough还要自己编译内核。
  2. 插槽2只有4x的速度。

通过一番Google,搜索到了vfio邮件列表当中的一封邮件(Re: [vfio-users] Boot using second GPU?),遂添加了video=efifb:off内核参数,并将两块卡的位置恢复到之前的样子。

不过问题又来了,Xorg无论如何都无法启动。我在Xorg.conf.d下添加了显示卡配置文件,但Xorg仍然抱怨无法找到监视器。好吧,那我继续添加监视器配置。这时Xorg日志中显示KMS(Kernel Mode Setting)加载失败。

nouveau是依赖于KMS运行的,但是我没有关闭KMS啊?查看Arch Wiki

At first, note that for any method you use, you should always disable:

  • Any vga= options in your bootloader as these will conflict with the native resolution enabled by KMS.
  • Any video= lines that enable a framebuffer that conflicts with the driver.
  • Any other framebuffer drivers (such as uvesafb).

嗯,好吧。

找了找,闭源驱动是不依赖KMS的,那就装闭源驱动好了。

不过,即便开了DRM kernel mode setting,性能仍然弱鸡,Kwin处处可见卡顿,tty直接黑屏,进入GRUB就开始黑屏,直到Xorg启动。难怪NVIDIA的Troubleshooting和Tips and Tricks都要单独一页,嗯。

最后也不知道这些问题是切换主GPU产生的还是驱动问题,不过tty用不了,GRUB看不见,这还能用么?卡退了。换主板。

 

 

又一次奇特的问题解决

因为有在床上开电脑的需求,所以某天爬了Arch Wiki来配置WOL。

碰到的第一个问题就是跑# ethtool interface | grep Wake-on压根没有任何输出,想了想E2400应该还没寒酸到连WOL支持都没有,遂Google一番看到Arch论坛有个求助帖,解答就是再读一遍Wiki…

好吧,拉到Wiki的在下面,发现确实有alx相关的内容,虽然such as里面没有E2400,但E2400应该是包括在内吧…嗯。

去AUR搜索一番,果然有人已经打好包了,就是alx-wol-dkms,装完之后美滋滋,WOL运行一切正常。

不过问题很快又来了,我发现这个包在内核更新的时候不会自动重编译,必须再装一遍这个包,pacman hooks才能正常工作。最初我还以为手贱删了什么东西,外加重新装过之后再次安装内核也能自动编译了,就当问题解决了。不过我很快就发现,一旦重启一次,安装内核的时候又不能自动重新编译了…

继续阅读“又一次奇特的问题解决”

水仙花数问题

来自Wikipedia

数论中,水仙花Narcissistic number[1][2],也被称为超完全数字不变数pluperfect digital invariant, PPDI[3]自恋自幂数阿姆斯壮阿姆斯特朗数Armstrong number[4] ,用来描述一个N位非负整数,其各位数字的N次方和等于该数本身。

 

继续阅读“水仙花数问题”

猜数字4.0

二话不说上源码。

#! /usr/bin/python
"""--- Game V4 ---"""
import random
Secret = random.randint(0,50)
# 由random模块提供,生成一个随机整数
Times = 5
TypeAnswer = input("猜数字,0-50之间,有五次机会\n")
while not TypeAnswer.isdigit():                       
# not表示反转布尔值
# str.isdigit判断这个str中是否全为数字
# 类似的,同时还有isalnum判断所有字符都是数字或字母、isalpha判断全是字母
# islower判断全部小写字母、isupper判断全部大写字母、istitle判断全部首字母大写
# isspace判断全部为空白字符
    print("只能输入阿拉伯数字")
    TypeAnswer = input("重新输入一遍\n")
else:
    Guess =int(TypeAnswer)
    # 将str转为int,同样的,还有float、str两个函数
    while Guess != Secret:
        Times = Times - 1
        while not TypeAnswer.isdigit():
            print("只能输入阿拉伯数字")
            TypeAnswer = input("重新输入一遍\n")
        else:
            if  Times > 0:
                TimesRemin = str(Times)
                print("你还有"+ TimesRemin +"次机会")
                # 字符串的拼接
                if Guess > Secret:
                    print("大了")
                else:
                    print("小了")
                TypeAnswer = input("重新猜一遍\n")
                Guess = int(TypeAnswer)
                # 重新为TypeAnswer赋值
            else:
                print("机会用完了~")
                Answer = str(Secret)
                print("正确答案是" + Answer)
                break
    else:
        print("你答对了")



 

Say Hello to Python

三分钟热度的新对象……

Hello Python

Hello World太俗,来一句Hello Python。

>>> print("Hello Python!")
Hello Python!

“Hello Python!”是一个string。
那如果我要写:「”PHP”是最好的语言」呢?
可以使用\转义。

>>> print("\"PHP\"是最好的语言")
"PHP"是最好的语言

运算

>>> 3+5
8

>>> print(3+5*5+5-5)
28

这计算器好像还挺好用的。
甚至string都可以和int做乘法运算。

>>> print("a string\n"*3)
a string
a string
a string

不过除了乘法之外都是不行的,浮点数也不行。

>>> print("a string\n"+3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not int
>>> print("a string\n"-3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'int'
>>> print("a string\n"/3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'str' and 'int'
>>> print("a string\n"*3.1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'

不过仔细想想,对string做除了整数乘法的其他运算都感觉怪怪的……

干掉「没有找到数据库错误」

强迫症拯救世界!!!

近期yaourt更新(orpacman?)之后,每次执行yaourt -Syu之后都有一行恼人的提示:

尽管我知道这句话的原文是:「No database error have been found.」,也就是说数据库没有错误的意思,而且我也因为yaourt缺乏维护(参见Wiki(翻译很烂))早早换用了trizen,但总还是有喜欢用yaourt的强迫症患者忍受不了这个问题。
查看yaourt的源码可以看到(位于/lib/misc.sh),yaourt的这个动作实际上是调用了pacman -Dk来完成的。于是很自然地,可以想到两种解决办法。
继续阅读“干掉「没有找到数据库错误」”

关于KDE「文件搜索」的一些设置

Can you work-out-of-box???

自从某次系统更新之后,我的Dolphin文件搜索功能就一直不大正常,但我抱着能将就用就将就用的心态一直忍着。直到今天要改源码的时候才发现没有搜索这文件管理器真是不能用……
继续阅读“关于KDE「文件搜索」的一些设置”

闲的蛋疼系列:将Brook代理转发为Shadowsocks代理

自己提出的蛋疼需求,再如何也要满足

声明:这篇博客可能并没有任何的卵用,有很多更直接的方法来实现目的,比如说直接换代理软件。
前段时间自建SSR一天挂一个IP,于是决定换了其他代理工具。在当时本决定使用V2Ray,但当时我还是个Linux Newbie,连WinSCP都用不利索,自然没法配置相对没那么「用户友好」的V2Ray,而使用了配置十分简单的Brook。
Brook在翻墙方面为什么问题,性能不错,但是它的客户端并不好用。在电脑上还好,一次设置好之后也没什么麻不麻烦的,开个socks5代理再配合SwitchyOmega之类的浏览器插件使用即可。
而在Android/iOS上面就只好使用官方客户端了,但官方客户端实在是不好用。无论是稳定性还是功能都比SS/SSR客户端相差甚远。
于是我就萌生了一个想法,能不能通过代理转发来使用Brook?
继续阅读“闲的蛋疼系列:将Brook代理转发为Shadowsocks代理”