c 语言常量的使用

常量是C语言程序设计中经常用到的一种基础数据类型,比如Pi = 3.1415926, 可以定义一个Pi的常量,这样在需要修改常量时只需要修改定义的常量值就行了,不必要直接赋值’字面值’。

常量的最主要特性就是值不可变,记住这点就行了。

C 语言中的几种常量类型

1. 整数常量

整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。

整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。

整数常量例子

212         /* 合法的 */
215u        /* 合法的 */
0xFeeL      /* 合法的 */
078         /* 非法的:8 不是八进制的数字 */
032UU       /* 非法的:不能重复后缀 */

85         /* 十进制 */
0213       /* 八进制 */
0x4b       /* 十六进制 */
30         /* 整数 */
30u        /* 无符号整数 */
30l        /* 长整数 */
30ul       /* 无符号长整数 */

2. 浮点常量

浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。

当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。

浮点常量的实例:

3.14159       /* 合法的 */
314159E-5L    /* 合法的 */
510E          /* 非法的:不完整的指数 */
210f          /* 非法的:没有小数或指数 */
.e55          /* 非法的:缺少整数或分数 */

3. 字符常量

字符常量是括在单引号中,例如,’x’ 可以存储在 char 类型的简单变量中。

字符常量可以是一个普通的字符(例如 ‘x’)、一个转义序列(例如 ‘\t’),或一个通用的字符(例如 ‘\u02C0’)。

在 C 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。下表列出了一些这样的转义序列码:

转义序列	含义
\\	\ 字符
\'	' 字符
\"	" 字符
\?	? 字符
\a	警报铃声
\b	退格键
\f	换页符
\n	换行符
\r	回车
\t	水平制表符
\v	垂直制表符
\ooo	一到三位的八进制数
\xhh . . .	一个或多个数字的十六进制数

定义常量

把常量定义为大写字母形式,是一个很好的编程实践。

方法1:使用 #define 预处理器

#include <stdio.h>
 
#define LENGTH 10   
#define WIDTH  5
#define NEWLINE '\n'
 
int main()
{
 
   int area;  
  
   area = LENGTH * WIDTH;
   printf("value of area : %d", area);
   printf("%c", NEWLINE);
 
   return 0;
}

方法2:使用 const 关键字

#include <stdio.h>
 
int main()
{
   const int  LENGTH = 10;
   const int  WIDTH  = 5;
   const char NEWLINE = '\n';
   int area;  
   
   area = LENGTH * WIDTH;
   printf("value of area : %d", area);
   printf("%c", NEWLINE);
 
   return 0;
}

 

分享一款录制gif动画的软件

首先LICEcap真的很小,真的很简洁!我个人第一感觉是这个工具真的很好用。大小只有227KB。

这款软件的中间部分是透明的也就是你要录制的视频大小,录制视频的大小是根据你的录屏软件窗口大小决定的,另外一个重要参数就是最左下角的Max FPS: 4,这个参数是每秒帧数,值越大越清晰,但是所占的容量也就越大。

使用步骤

  1. 打开录屏软件,把录屏软件的窗口拉到你所需要的大小并且让所录内容在录屏软件中心。
  2. 设置Max FPS的大小(不设置也可以,这个值只是用来调整清晰度的)
  3. 点击Record按钮,找到你要存放的视频目录,在文件名一栏中填写上一个名字
  4. 点击保存按钮这是录屏软件就会自动开始录屏(录屏的过程中录屏软件可以移动,这样就可以随意录制整个电脑屏幕的所有区域了)
  5. 在录制过程中点击录屏软件的Stop按钮即可结束录制

视频演示

GIF


官网下载: https://www.cockos.com/licecap/

本站下载: licecap128-install

用Photoshop把方形图片弄成圆形的

我经常会遇到需要圆形的图片,但是不管拍的照片还是网上的图片大部分都是方向或矩形的,这就使得我需要自己想办法把图片弄成圆的了。

网上查了下只需要4步PS就可以实现

  1. 用Photoshop打开要修改的图片
  2. 用椭圆选框工具在图片上画个圆(同时要按下Shift)
  3. 按下Ctrl + J 以所画圆形选择区域新建一个图层
  4. 在背景图层前面的眼睛勾选掉
  5. 到处为你需要的格式图片即可

视频演示

GIF

 

录屏软件用的是LICEcap

CSS 链接

给链接添加CSS样式,如:链接的文本颜色、是否有下划线等,而且在不同状态下的链接有不同的样式可以设置。

链接的几种状态

  • a:link – 正常状态, 未访问过的链接
  • a:visited – 用户已访问过的链接
  • a:hover – 当用户鼠标放在链接上时
  • a:active – 链接被点击的那一刻

当有多种状态的链接样式时,有一些顺序规则:

  • a:hover 必须跟在a:link 和 a:visited 后面
  • a:active 必须跟在a:hover 后面

简单示例

a:link {
    text-decoration: none;
    background: #aa5957;
}

a:visited {
    text-decoration: none;
    background: #33aa88;
}

a:hover {
    text-decoration: underline;
    background: #5a5a8c;
}

a:active {
    text-decoration: underline;
    background: #459a9a;
}

 

流畅的python–第一章 数据模型

Guido 对语言设计美学的深入理解让人震惊。我认识不少很不错的
编程语言设计者,他们设计出来的东西确实很精彩,但是从来都不
会有用户。Guido 知道如何在理论上做出一定妥协,设计出来的语
言让使用者觉得如沐春风,这真是不可多得。

——Jim Hugunin
Jython 的作者,AspectJ 的作者之一,.NET DLR 架构师

Python是我最喜欢的编程语言,可能是Python的风格吸引了我,比如获取一个字符串的长度可以用len(str),其他语言的风格可能是str.len()咳咳!

Python最好的品质就是一致性,这是这本书上说的,我的理解就是比如:我们可以用len获取大多数对象的长度,如,字符串,列表,元组,还有我们自定义的类通过实现__len__()也可以实现同样的特性,这样就保持了程序的一致性。这就是所谓的”Pythonic”吧。

python的数据模型

本书第一章讲的就是Python 的数据模型,因为数据模型是Python的核心组成。我的理解是Python的数据模型就是为了创建Python风格,而创建的个个组件,比如每个对象的底层都有很多的类似__len__()这样带前后双下划线的方法。这些方法赋予了Python魔力。Python的设计思想非常的有特色,通过慢慢学习就会体会到这门语言的特征。Python的设计思想完全体现在了数据模型上,数据模型是一堆一堆的为Python提供特色而发明的小组件。

不管在哪种框架下写程序,都会花费大量时间去实现那些会被框架本身调用的方法, Python 也不例外。Python 解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以两个下划线开头,以两个下划线结尾(例如 __getitem__)。比如 obj[key]的背后就是 __getitem__ 方法,为了能求得 my_collection[key] 的值,解释器实际上会调用my_collection.__getitem__(key)。这些特殊方法名能让你自己的对象实现和支持以下的语言构架,并与之交互:

  • 迭代集合类
  •  属性访问
  • 运算符重载
  • 函数和方法的调用
  • 对象的创建和销毁
  • 字符串表示形式和格式化
  • 管理上下文(即 with 块)

上面这段是从该书上复制的,我的理解就是通过给我们自己的类添加实现__xxx__()这样的方法,就能与Python语言自身的大多数特性与之交互,这样我们自己的类看着就跟Python自身自带的类就没什么两样了。__xxx__()类似这样的方法在Python中称为特殊方法,我们用不到直接调用它们,比如在一个类中如果实现了__len__()这个方法,我们就可以直接使用len(类名)这样间接的调用__len__(),这就是Python的特殊所在。

一个纸牌程序

import collections
from random import choice

# 创建一个纸牌类,有两个属性1:rank,2: suit
Card = collections.namedtuple('Card', ['rank', 'suit'])


class FrenchDeck(object):
    """

    """
    ranks = [str(n) for n in range(2, 11)] + list('JQKA')
    suits = 'spades diamonds clubs hearts'.split()

    def __init__(self):
        self._cards = [Card(rank, suit) for suit in self.suits
                       for rank in self.ranks]

    def __len__(self):
        return len(self._cards)

    def __getitem__(self, position):
        return self._cards[position]

    def getRandomCard(self):
        return choice(self._cards)

    def get4Card(self):
        card1 = list()
        for i in range(13):
            card1.append(self.getRandomCard())
            self._cards.pop(self._cards.index(card1[-1]))
        return card1

这个程序是从该书上复制的,getRandomCard()和get4Card()两个函数是我自己加的,前者是从随机抽取一张牌,用到了random模块中的choice方法,后者是抽取13张牌并且从原有牌中删除掉抽取出来的牌,相当于发13张牌,调用四次刚好把牌发完。该程序的核心是__len__()、__getitem__()这两个方法。

代码解释:

  1. 导入collections模块和random模块里边的choice方法
  2. 用collections模块里边的namedtuple()创建一个带名字的元组类Card,该类有两个属性’rank’和’suit’,用该模块创建的类只有属性。
  3. 创建类一个FrenchDeck类,该类是Python中的普通类
  4. 创建类中所需要的属性和方法
    1. 创建ranks列表,用了python中的列表生成表达式, range(2, 11)是生成纸牌的数字2~10, list(‘JQKA‘)是纸牌的非数字那几张
    2. suits是纸牌的花色,用到了字符串的split()方法,此方法将会分割字符串中有空格间隔的字符
    3. 在__init__()方法中再次用到Python中的列表生成表达式生成整副牌,列表生成式中用到了Card元组类,注意着里成员变量的前面有单下划线说明是私有的,尽量只在类内使用

开始学习–流畅的python

挑选了好久终于发现了《流畅的Python》这本书,大概看前两张,很不错。和其他的Python书记有很大的不同,这本书讲的知识点比较深而且都是Python语言特有的特性,把Python的特性讲的很到位的感觉。作为新手准备开始学习这本书了,作为学习记录我回把学习中的知识点记在我的博客上来。

本书一共六个部分二十一章,内容挺庞大的,想办法怎么把这本书的精华给吸收了!!!

第一章 数据模型

第二章 序列构成的数组

第三章 字典和集合

第四章 文本和字节序列

第五章 一等函数

第六章 使用一等函数实现设计模式

第七章 函数装饰器和闭包

第八章 对象引用、可变性和垃圾回收

第九章 符合Python风格的对象

第十章 序列的修改、散列和切片

第十一章 接口: 从协议到抽象基类

第十二章 继承的优缺点

第十三章 正确重载运算符

第十四章 可迭代的对象、迭代器和生成器

第十五章 上下文管理器和else块

第十六章 协程

第十七章 使用期物处理并发

第十八章 使用asvncio包处理并发

第十九章 动态属性和特性

第二十章 属性描述符

第二十一章 类元编程

 

Git 入门常用命令

git 是现在最火的版本管理系统,搞编程必须会这个才行,在此几下git的常用命令。

1. 安装后的初始化配置用户名和邮箱地址

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

2. 初始化一个空仓库

$git init

同时git帮我们自动创建了一个master分支作为当前分支

3. 把文件添加到仓库

$git add filename
这条命令是把文件添加到暂存区
$git commit -m "Message text"
这条命令把所有暂存区的文件添加到版本库的当前分支

4. 添加远程仓库

$git remote add origin git@github.com:FY2008/pythonExample.git
这条命令添加了一个远程仓库到当前仓库,远程仓库名称origin可以修改
$git push -u origin master
把本地仓库推送到远程第一次远程提交需要-u


5. 从远程仓库拉取

$ git pull <远程主机名> <远程分支名>:<本地分支名>
$ git pull origin next:master
如果远程分支(next)要与当前分支合并,则冒号后面的部分可以省略。上面命令可以简写为:
$ git pull origin next

6. 创建分支与切换分支

$git branch dev 创建分支
$git checkout dev 切换分支
$git checkout -b dev 创建并切换分支
$git branch 查看当前分支
$git merge dev 合并dev分支到master分支上, 当前分支要在master上边才行。
git merge命令用于合并指定分支到当前分支

$git branch -d dev 删除分支

7. 创建ssh key

$ssh-keygen -t rsa -C "your_email@example.com"
一直回车即可
然后复制 ~/.ssh/id_rsa.pub 文件中的内容到github即可。

 

Python 常用模块之 copy 对象复制

copy 是python 内置的对象复制模块,该模块提供了两个函数copy()和deepcopy(),前者是浅复制,后者为深复制。

copy() 浅复制

浅复制的对象只能对顶层对象有效,对象内部的其他对象都无效

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Rectangle:
    def __init__(self, width, height, corner):
        self.width = width
        self.height = height
        self.corner = corner

p = Point(0, 0)
box = Rectangle(100, 50, p)

# 我们创建了两个类,一个Point点,一个Rectangle矩形
# Rectangle有三个属性,宽,高,和一个角点
# 我们用copy浅复制一个box对象
box1 = copy.copy(box)
# 这个时候box1的宽和高和box的是完全不相干的,你修改box1的宽和高不会影响box的
# 但是你修改box1.corner.x,box.corner.x也会受影响,应为它们本身就是一个这就是浅复制

# 这是深复制
box2 = copy.deepcopy(box)
# 这时你在修改box2的所有属性都不会影响其他的,深复制可以复制所有层次

本文到此结束,谢谢阅读!峰影

今天玩了一下python turtle 模块海归图形

昨天看到一篇关于python turtle 模块的教程,感觉挺有意思的,turtle意思是甲鱼、海龟,这是一个简单的图形库,使用这个库可以用代码画画。

今天简单参考使用帮助写了一个画菱形组合图的代码,效果如下:

turtle 官网文档:https://docs.python.org/3/library/turtle.html

代码:

'''
用python turtle模块画一个菱形组合图
url: https://www.z10.xin
about: 峰影
'''
import turtle
import math

bob = turtle.Turtle()
bob.speed(10) # 画图速度


def rhombus(t, color, ang, length):
    '''
    该函数用来画一个菱形
    ang参数代表画完一个菱形后转义的角度
    '''
    t.color(color, color) # 设置钢笔和填充颜色
    t.begin_fill() # 开始填充
    t.forward(length) # 正向移动
    t.right(45) # 向右转45°
    t.forward(length)
    t.right(135)
    t.forward(length)
    t.right(45)
    t.forward(length)
    t.right(ang) # 画完一个菱形后偏移一个角度
    t.end_fill() # 结束填充

for i in range(9):
    for p in range(5):
        if p == 1:
            rhombus(bob, 'red', 150, 180)

        if p == 2:
            rhombus(bob, 'blue', 150, 200)

        if p == 3:
            rhombus(bob, 'green', 150, 220)

        if p == 4:
            rhombus(bob, 'yellow', 150, 240)

turtle.mainloop()

可以通过改变函数 rhombus(t, color, ang, length)的参数来修改绘制的图形,有兴趣的可以复制运行下试试感觉!

另外分享一个不错的Python新手教程:http://www.codingpy.com/books/thinkpython2/index.html

视频演示

本文结束,谢谢阅读!