python学习笔记:三、函数

这是第三篇python学习笔记,我们即将要学习python的函数。内容主要包括两个部分,函数的声明和函数的调用。

函数声明和调用

比如我们要声明一个“吃”的函数,语法如下:

def eat():
    return "eat something"
print(eat())

上面是一个没有参数的函数,做的事情很简单,声明一个函数,然后返回一个字符串。接下来要增加一个参数了。

def ead(food):
    return "eat %s" % food
print(eat('fruit'))

可以看到,上面声明了一个带有一个参数的函数,当然可以声明带两个,三个等。这些都是固定的,那么如果要声明一个不固定参数的函数呢?看代码

# 比如下面就是吃一份主食和一些小吃
# 小吃可以是一个,也可以是多个
def eat(food, *snack):
     result = []
     result.append("eat %s\n" % food)
     for i in snack:
         result.append("also eat some %s\n" % i)
     return ''.join(result)
print(eat('rice', 'banana', 'apple'))

参数传递的注意事项

函数的使用很简单,不过在传递参数的时候需要注意一些事情,比如传值和传引用。这中区别在大部分语言中都会存在,python也不例外。由于在python中,一切皆为对象,因此我们称呼这个为传不可变对象和传可变对象。

先用一个例子来说名这个问题

def change(a):
    a = 1
b = 2
change(b)
print(b)
# 结果是2

上面的就是传递不可变对象,不可变对象传入之后会新建一份拷贝,返回新的对象。不可变对象有:整型、字符串、元组。

再看看传可变对象

def change(a):
    a.append(4)
b = [1,2,3]
change(b)
print(b)
# 结果是 [1,2,3,4]

很显然,b被改变了,这相当于传了一个引用,直接修改了原值。常见的可变对象有列表,字典。

默认参数

声明函数的时候可以预定义一些默认参数,比如查询分页的时候,可以默认每一页20条数据,默认根据时间字段,默认倒序。这样既节省函数的记忆成本又不失灵活性。

def query(page, per_page=20, order_by = 'date', order = 'desc'):
     return "query page %d, per page %d order by %s order %s" % (page, per_page, order_by, order)
print(query(1))
# query page 1, per page 20 order by date order desc

函数调用指定参数名称

这是一个非常好的特性,调用函数的时候可以直指定参数的名称,比如我只想更改查询的循序,python中可以直接这样写

print(query(page=1, order='asc'))

而在其他的语言,可能要把所有的参数都写一遍,python这点非常棒!

python学习笔记:二、 流程控制

根据如何学习一门新的语言这篇文章的指导,现在的步骤就是学习这门语言的流程控制了。

通常来讲,流程控制有顺序,选择,循环这几种。python也不例外,也有这三种流程控制。下面的一一学习。

顺序

顺序语句很简单,从上往下依次顺序执行。如:

a = 1
b = 2
print(a+b)

上面的语句就是顺序执行的语句。

选择

选择通常使用if和switch,但python中只有if这一个选择语句。语法是:

if 满足条件1:
    语句1
elif 不满足条件1满足1条件2
    语句2
else 都不满足
    语句3

比如用一个实际的例子

a = 1
b = 2
if a > b:
    print('a>b')
elif a < b:
    print('a<b')
else:
    print('a==b')
# 输出的结果是
a<b

if后面的条件可以使用 and 或者 or 组合。

a = -1
b = -2
if a<0 and a>b:
    print('b<0')
# 输出结果
b<0

循环

python中的循环有for … in 和while循环。

for … in 循环语法

for 变量 in 可迭代序列

其中可迭代序列有:字符串,列表,元组,集合。比如用python遍历一个列表

li = ["a","b","c"]
for i in li:
    print(i)
# 输出结果
a
b
c

使用range生成列表,然后用for…in遍历。这个在python中非常常见

for i in range(0,10):
    print(i)

while循环语法

while 满足条件:
    一直执行

比如

a = 0
while a<10:
    a += 1
    print(a)

树莓派zero连接wifi

这是一篇记录树莓派连接wifi的文章。

这里我们使用wpa_cli的交互环境来连接无线网,这比直接使用配置要方便得多。注意,wpa_cli需要在root环境下执行

终端下面执行: sudo wpa_cli -iwlan0

-i参数表示使用哪个网卡,我们需要指定只用wlan0这个网卡。具体可以执行ifconfig看看都有哪些网卡可以使用,如果你的树莓派带有wifi模块,那么一般是wlan0

进入交互模式之后,首先需要执行scan命令,该命令能扫描附近的热点。然后输入scan_result列出扫描出来的热点

> scan
OK
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
> scan_result
bssid / frequency / signal level / flags / ssid
00:00:00:00:00:00 2412 -37 [WPA2-PSK-CCMP][ESS] chao

上面扫描出了我的一个手机热点。

我们知道了热点的ssid之后就可以连接了,首先增加一个网络连接,执行add_network

> add_network
3

输出的结果是一个数字,这个是增加的id。然后后面需要用这个id配置一些网络参数,就和可视化的连接网络一样,最简单的就是需要配置网络的ssid,密码。

> set_network 3 ssid "chao"
OK
> set_network 3 psk "yourpassword"
OK

做好了之后就可以启用这个连接了,输入:enable_network 2。下面就会提示连接的信息了

> enable_network 3
OK
<3>Trying to associate with 00:00:00:00:00:00 (SSID='chao' freq=2412 MHz)
<3>Associated with 00:00:00:00:00:00
<3>CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully (based on lower layer success)
<3>WPA: Key negotiation completed with 00:00:00:00:00:00b[PTK=CCMP GTK=CCMP]
<3>CTRL-EVENT-CONNECTED - Connection to 00:00:00:00:00:00 completed [id=2 id_str=]

最后,不要忘了save_config,让这个配置后面可以继续使用

git设置全局ignore

git可以设定全局ignore,这样就不用在每一个项目里面设置ignore文件。

具体的方法是首先更改git全局配置

git config --global core.excludesfile ~/.gitignore_global

然后编辑~/.gitignore_global 文件

这个文件和gitignore写法完全一致

mac下git配置beyondcompare作为合并冲突工具

首先安装beyond compare,下载地址: http://www.scootersoftware.com/download.php

设置为默认的merge工具

git config --global merge.tool bc

设置为默认的diff工具

git config --global diff.tool bc

在使用git megetool 来解决冲突后,会生成 备份文件 (*.orig),大多数情况下不是我们想要的,在终端中配置:

git config --global mergetool.keepBackup false

这样就不会每次在解决冲突后生成对应的 .orig文件了.

 

php开发者的sublime插件和配置

作为一个php开发者,换工作环境的时候可能会重新配置编辑器,这里给出一个比较好的环境(也是我的常用环境)。

配置篇

每家公司都会有内部的规范,但是只要公司不是特别奇葩,那么规范一般是大同小异。根据规范来设定编辑器,那么写出来的代码则很容易符合规范了。此外,一个设置好的编辑器能够大大提高编码效率!

下面是我的配置,可以根据注释自行调整

{
    // 粗体文本
    "bold_folder_labels": true,
    // 显示所有的空白字符,这样可以看出空格和tab
    "draw_white_space": "all",
    // 设置字体
    "font_size": 15,
    "ignored_packages": [
        "Vintage"
    ],
    // 全屏打开
    "remember_full_screen": true,
    // 记住打开的文件
    "remember_open_files": true,
    // 标尺
    "rulers": [
        80
    ],
    // 显示文件的编码
    "show_encoding": true,
    // 在标题栏显示完整路径
    "show_full_path": true,
    // 关闭拼写检查
    "spell_check": false,
    // 设置tabsize为4个空格
    "tab_size": 4,
    // 转换tab为空格
    "translate_tabs_to_spaces": true,
    // 避免自动拆行
    "word_wrap": false
}

一个通用配置的意义在于无论在那些机器上,都能有一个熟悉的环境来安心写代码。不会因为编辑器的别扭带来的不适感。 (更多…)

centos7系统初初始化工作以及网站环境搭建(php7+nginx+mysql)

拿到一台做网站的主机, 我们先要做一些环境初始化的工作, 由于这些工作会有些繁琐,因此记录一下. 后面将这些流程写成一个shell脚本,一次性完成.此次工作流程如下:

  1. 安全性设置
  2. 额外的目录创建
  3. 网站环境搭建

安全性设置

一般从某云上买的主机, 默认账户是root, 为了不被暴力破解, 我们首先需要设置一个强一点的密码,不过更好的方法是禁用root, 另外创建一个用户来作为日常管理的账户.

(更多…)

docker 制作自己的 php-fpm镜像

php-fpm的镜像官方已经有了,但是直接拿过来用或许不行,不同的项目所需要的扩展不一定一样。所以这里我们以官方的php-fpm 5.6版本为基础镜像,在这个镜像上制作我们自己的镜像。开发环境安装尽可能多的扩展,线上环境则安装所需要的扩展。

为了构建我们的镜像,首先需要一个名为Dockerfile的文件,docker会根据这个Dockerfile来构建镜像。

首先使用FROM指令,表示当前构建的镜像的基础镜像

FROM php:5.6-fpm

docker会从他自己的镜像库中拉取php-fpm5.6的镜像。 (更多…)