
你怎么对待生活,生活就怎么对待你!
redis提供两种方式进行持久化: 一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化) 一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)。 RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。 AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。 二者优缺点 RDB存在哪些优势呢? 1). 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。 2). 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。 3). 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。 4). 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。 RDB又存在哪些劣势呢? 1). 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。 2). 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。 AOF的优势有哪些呢? 1). 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。至于无同步,无需多言,我想大家都能正确的理解它。 2). 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。 3). 如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。 4). AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。 AOF的劣势有哪些呢? 1). 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。 2). 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。 二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 eventually consistent的意思了。 4、常用配置 RDB持久化配置 Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开6379.conf文件之后,我们搜索save,可以看到下面的配置信息: save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。 save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。 save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。 AOF持久化配置 在Redis的配置文件中存在三种同步方式,它们分别是: appendfsync always #每次有数据修改发生时都会写入AOF文件。 appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。 appendfsync no #从不同步。高效但是数据不会被持久化。查看原文:http://www.chenqmc.com/?p=371
redis设置数据库密码及登录验证: 1、修改redis.conf文件,找到requirepass这一行, 取消注释,并加入自己的密码,保存退出 requirepass 123456 2、使用命令 pkill redis ,来关闭redis数据库进行重启, 重启命令 ./redis-server ../redis.conf 3、./redis-cli -c -p 6379 可以登录redis数据库, 此时可以登录,但是无法查看里面的内容 输入auth 123456(密码) 就可以登录数据库进行查看 4、如果设置有slave数据库,找到下面一行, 取消注释,并写入自己的密码 # masterauth masterauth 123456查看原文:http://www.chenqmc.com/?p=368
centos7在忘记密码的情况下修改密码: 1、在重启系统过程中,快速在键盘上的上下键, 之后按下e键,进入编辑模式 2、在编辑模式,移动光标到LANG=en_US.UTF-8, 空格然后在追加 init=/bin/sh 3、然后按Ctrl+X进行引导启动,就进入到sh-4.2#的单用户模式下 4、首先挂载根目录为可读可写模式 mount -o remount,rw / 然后就可以使用passwd来修改root密码 passwd root 输入两次一样的密码, 如果开启了selinux,则需要输入 touch /.autorelabel 5、然后重启系统即可 exec /sbin/init 或者 exec /sbin/reboot 6、重启以前,单用户模式下可以使用的命令都可以使用 包括使用vim修改配置文件查看原文:http://www.chenqmc.com/?p=366
这里创建6个redis节点,其中三个为主节点,三个为从节点。 redis和端口对应关系: 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 从: 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 步骤: 1,下载redis。官网下载3.0.0版本,之前几的版本不支持集群模式 下载地址:http://download.redis.io/releases/redis-3.0.0.tar.gz 2:上传服务器,解压,编译 tar -zxvf redis-3.0.0.tar.gz mv redis-3.0.0 redis3.0 cd /usr/local/redis3.0 make & make install 3:创建集群需要的目录并拷贝redis mkdir -p /usr/local/cluster mkdir -p /usr/local/cluster/7000 mkdir -p /usr/local/cluster/7001 mkdir -p /usr/local/cluster/7002 mkdir -p /usr/local/cluster/7003 mkdir -p /usr/local/cluster/7004 mkdir -p /usr/local/cluster/7005 cp -rf /usr/local/redis3.0/* /usr/local/cluster/7000/ cp -rf /usr/local/redis3.0/* /usr/local/cluster/7001/ cp -rf /usr/local/redis3.0/* /usr/local/cluster/7002/ cp -rf /usr/local/redis3.0/* /usr/local/cluster/7003/ cp -rf /usr/local/redis3.0/* /usr/local/cluster/7004/ cp -rf /usr/local/redis3.0/* /usr/local/cluster/7005/ 4:修改配置文件redis.conf vi /usr/local/cluster/7000/redis.conf ##修改配置文件中的下面选项 port 7000 daemonize yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes #同样再对其它配置文件进行修改 vi /usr/local/cluster/7001/redis.conf vi /usr/local/cluster/7002/redis.conf vi /usr/local/cluster/7003/redis.conf vi /usr/local/cluster/7004/redis.conf vi /usr/local/cluster/7005/redis.conf ##注意:不同的目录配置不同的redis.conf中的port 5:启动6个redis cd /usr/local/cluster/7000/src redis-server ../redis.conf cd /usr/local/cluster/7001/src redis-server ../redis.conf cd /usr/local/cluster/7002/src redis-server ../redis.conf cd /usr/local/cluster/7003/src redis-server ../redis.conf cd /usr/local/cluster/7004/src redis-server ../redis.conf cd /usr/local/cluster/7005/src redis-server ../redis.conf ##启动之后使用命令查看redis的启动情况ps -ef|grep redis 6,创建redis集群 cd /usr/local/redis3.0/src ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 6.1执行上面的命令的时候会报错,因为是执行的的脚本,需要 错误内容:/usr/bin/env: ruby: No such file or directory 所以需要安装ruby的环境,这里推荐使用yum install ruby yum install ruby 6.2然后再执行第步的创建集群命令,还会报错,提示缺少rubygems组件 错误内容: ./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError) from ./redis-trib.rb:24 yum install rubygems 6.3再次执行第步的命令,还会报错,提示不能加载redis,是因为缺少redis的接口 错误内容: /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in gem_original_require': no such file to load -- redis (LoadError) from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:inrequire' from ./redis-trib.rb:25 gem install redis 这里可能无法安装,因为无法连接gem服务器: [@zw_22_90 src]# gem install redis --version 3.0.0 ERROR: Could not find a valid gem 'redis' (= 3.0.0) in any repository ERROR: While executing gem ... (Gem::RemoteFetcher::FetchError) 需要手工下载并安装: wget https://rubygems.global.ssl.fastly.net/gems/redis-3.2.1.gem gem install -l ./redis-3.2.1.gem 6.4 再次执行第步的命令,正常执行 输入yes,然后配置完成。 [@zw_22_90 src]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 7,redis-cli命令进入集群环境 [@zw_22_90 src]# redis-cli -c -p 7000 127.0.0.1:7000> quit;查看原文:http://www.chenqmc.com/?p=359
#关闭ipv6 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 避免放大攻击 net.ipv4.icmp_echo_ignore_broadcasts = 1 开启恶意icmp错误消息保护 net.ipv4.icmp_ignore_bogus_error_responses = 1 #关闭路由转发 net.ipv4.ip_forward = 0 开起路由转发将0改为1即可 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 #开启反向路径过滤 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 #处理无源路由的包 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 #关闭sysrq功能 kernel.sysrq = 0 #core文件名中添加pid作为扩展名 kernel.core_uses_pid = 1 开启SYN洪水攻击保护 net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为1,表示开启的; 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数 net.ipv4.tcp_max_syn_backlog = 262144 #修改消息队列长度 kernel.msgmnb = 65536 kernel.msgmax = 65536 #设置最大内存共享段大小bytes kernel.shmmax = 68719476736 kernel.shmall = 4294967296 #timewait的数量,默认180000 net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.tcp_sack = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_rmem = 4096 87380 4194304 TCP读buffer,可参考的优化值: 32768 436600 873200 net.ipv4.tcp_wmem = 4096 16384 4194304 tcp写buffer,可参考的优化值: 8192 436600 873200 net.core.wmem_default = 8388608 TCP写buffer的默认值 net.core.rmem_default = 8388608 TCP读buffer的默认值 net.core.rmem_max = 16777216 TCP写buffer的最大值 net.core.wmem_max = 16777216 TCP写buffer的最大值 #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目 net.core.netdev_max_backlog = 262144 #限制仅仅是为了防止简单的DoS 攻击 net.ipv4.tcp_max_orphans = 3276800 #未收到客户端确认信息的连接请求的最大值 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_timestamps = 0 #内核放弃建立连接之前发送SYNACK 包的数量 net.ipv4.tcp_synack_retries = 1 #内核放弃建立连接之前发送SYN 包的数量 net.ipv4.tcp_syn_retries = 1 #启用timewait 快速回收 net.ipv4.tcp_tw_recycle = 1 #开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_fin_timeout = 1 #当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时 net.ipv4.tcp_keepalive_time = 30 #允许系统打开的端口范围 net.ipv4.ip_local_port_range = 1024 65000 #修改防火墙表大小,默认65536 #net.netfilter.nf_conntrack_max=655350 #net.netfilter.nf_conntrack_tcp_timeout_established=1200 确保无人能修改路由表 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0查看原文:http://www.chenqmc.com/?p=352
Apache2.2安全配置和性能优化 主要修改配置文件 1、Apache禁止遍历目录 将Options Indexes FollowSymLinks中的Indexes 去掉,就可以禁止Apache 显示该目录结构。Indexes 的作用就是当该目录下没有index.html文件时,就显示目录结构。 二、apache 隐藏版本信息 1.隐藏Apache版本信息 测试默认apache 的状态信息 [root@1314it conf]# curl -Is localhost HTTP/1.1 200 OK Date: Tue, 16 Nov 2010 04:20:15 GMT Server: Apache/2.2.3 (CentOS) DAV/2 PHP/5.1.6 mod_perl/2.0.4 Perl/v5.8.8 X-Powered-By: PHP/5.1.6 Connection: close Content-Type: text/html; charset=GB2312 修改主配置文件httpd.conf,将下面两行添加到配置文件的末尾 ServerSignature Off ServerTokens ProductOnly 重启apache 测试 测试隐藏版本号后apache 的状态信息 [root@1314it conf]# curl -Is localhost HTTP/1.1 200 OK Date: Tue, 16 Nov 2010 04:21:41 GMT Server: Apache X-Powered-By: PHP/5.1.6 Connection: close Content-Type: text/html; charset=GB2312 三、关闭trace-method 配置文件添加一行 TraceEnable off 四、Apache并发数调整 查看Apache的工作模式:apache -l 如果出现prefork.c,则是工作在prefork模式下 查看当前的连接数: ps aux|grep httpd|wc -l pgrep httpd|wc -l 计算httpd占用内存的平均数: ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}' 使用ulimit -n 65535 增加文件打开数量 # prefork MPM # StartServers:启动时服务器的进程数 # MinSpareServers:保有的备用进程的最小数目 # MaxSpareServers:保有的备用进程的最大数目 # MaxClients:服务器允许启动的最大进程数 # MaxRequestsPerChild:一个服务进程允许的最大请求数 <IfModule prefork.c> // 设置使用预生派(Prefork MPM)运行方式的参数,此方式是Redhat默认的方式 StartServers 8 // 设置服务器启动时运行的进程数为8 MinSpareServers 5 // 如果低于5个空闲子进程,就会创建新的子进程为客户提供服务 MaxSpareServers 20 // 如果存在高于20个空闲子进程,就创建逐一删除的子进程来提高系统性能 MaxClients 150 // 限制同一时间连接数不能超过150 MaxRequestPerChild 1000 // 限制每个子进程在结束请求之前能处理的连接请求为1000 </IfModule> # worker MPM # StartServers:启动时的服务进程数目 # MaxClients:允许同时连接的最大用户数目 # MinSpareThreads:保有的最小工作线程数目 # MaxSpareThreads:允许保有的最大工作线程数目 # ThreadsPerChild:每个服务进程中的工作线程常数 # MaxRequestsPerChild:服务进程中允许的最大请求数目 <IfModule worker.c> // 设置使用工作者模式(worker MPM)运行方式的参数 StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule> # perchild MPM # NumServers:服务进程数量 # StartThreads:每个服务进程中的起始线程数量 # MinSpareThreads:保有的最小线程数量 # MaxSpareThreads:保有的最大线程数量 # MaxThreadsPerChild:每个服务进程允许的最大线程数 # MaxRequestsPerChild:每个服务进程允许连接的最大数量 <IfModule perchild.c> // 设置使用独立子进程(Perchild MPM)运行方式的参数 NumServers 5 StartThreads 5 MinSpareThreads 5 MaxSpareThreads 10 MaxThreadsPerChild 20 MaxRequestsPerChild 0 </IfModule> 用户敲下一个域名访问服务器的过程是如何进行的? 这是DNS解析的问题。 首先客户的服务器会检查自己的缓存,如果有对应的ip, 则直接返回ip,客户使用ip去访问服务器,与服务器进行TCP三次握手, 三次握手建立完毕,发送HTTP数据请求到服务器,服务器进行响应。 如果没有,则请求会发往本地DNS服务器,本地的DNS服务器负责解析, 如果没有对应ip,发起迭代查询,直到查询到所需的ip地址, 然后再使用ip去访问服务器,进行tcp三次握手,三次握手建立完毕后, 发送http请求,服务器进行响应。 查看原文:http://www.chenqmc.com/?p=343
查看原文:http://www.chenqmc.com/?p=336
docker centos7 安装ssh 原文链接:http://blog.csdn.net/mergerly/article/details/54709919 一. 从docker hub 下载centos 官方镜像 hr:centos7 hr$ docker pull centos:7 下载完后,查看本地资源库: hr:centos7 hr$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 7 ce20c473cd8a 7 weeks ago 172.3 MB 运行容器 hr:centos7 hr$ docker run -i -t centos:7 /bin/bash 二. 安装passwd,openssl,openssh-server [root@b5926410fe60 /]# yum install passwd openssl openssh-server -y 启动sshd: # /usr/sbin/sshd -D 这时报以下错误: [root@ b5926410fe60 /]# /usr/sbin/sshd Could not load host key: /etc/ssh/ssh_host_rsa_key Could not load host key: /etc/ssh/ssh_host_ecdsa_key Could not load host key: /etc/ssh/ssh_host_ed25519_key 执行以下命令解决: [root@b5926410fe60 /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' [root@b5926410fe60 /]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' [root@b5926410fe60 /]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' 然后,修改 /etc/ssh/sshd_config 配置信息: UsePAM yes 改为 UsePAM no UsePrivilegeSeparation sandbox 改为 UsePrivilegeSeparation no [root@b5926410fe60 /]# sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config [root@b5926410fe60 /]# sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config 修改完后,重新启动sshd [root@b5926410fe60 /]# /usr/sbin/sshd -D 三. 修改root 密码 [root@b5926410fe60 /]# passwd root 四. 查看容器ip地址(如果宿主机是linux操作系统则跳过这一步) [root@b5926410fe60 /]# ip addr ls eth0 84: eth0@if85: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:2/64 scope link valid_lft forever preferred_lft forever 五. 将当前容器保存为镜像 hr:centos7 hr$ docker ps -all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b5926410fe60 centos:7 "/bin/bash" 4 minutes ago Exited (0) 4 seconds ago centos7ssh hr:centos7 hr$ docker commit b5926410fe60 herong/centos7-ssh 六. 在宿主机上基于新创建的镜像启动新的容器 --先删除之前的容器 hr:centos7 hr$ docker ps -all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4122f818a741 herong/centos7-ssh:latest "/usr/sbin/sshd" 13 seconds ago Exited (0) 13 seconds ago happy_mclean hr:centos7 hr$ docker rm -f 4122f818a741 --基于新镜像运行容器 hr:centos7 hr$ docker run -d -p 10022:22 herong/centos7-ssh:latest /usr/sbin/sshd -D --查看映射端口是否成功 hr:centos7 hr$ docker ps -all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4966d35fe0a3 herong/centos7-ssh:latest "/usr/sbin/sshd -D" 3 seconds ago Up 3 seconds 0.0.0.0:10022->22/tcp compassionate_kowalevski hr:centos7 hr$ docker port 4966d35fe0a3 22/tcp -> 0.0.0.0:10022 七. 从宿主机连接到容器 w 如果宿主机是非linux操作系统,则需要通过docker-machine ip连到容器 -- 查看docker-machine Ip地址 hr:centos7 hr$ docker-machine ip default 192.168.99.100 --通过docker-machine ip 连接到容器,输入之前设置的密码即可登录成功 hr:centos7 hr$ ssh root@192.168.99.100 -p 10022 The authenticity of host '[192.168.99.100]:10022 ([192.168.99.100]:10022)' can't be established. ECDSA key fingerprint is SHA256:d3JNckcTVv1ASJlwv+IT/bJwlzMC4U1T/PmsKYIHMhQ. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[192.168.99.100]:10022' (ECDSA) to the list of known hosts. root@192.168.99.100's password: [root@4966d35fe0a3 ~]# pwd /root w 如果宿主机是linux操作系统,则通过第4步查看到的ip地址连接 hr:centos7 hr$ ssh root@172.17.0.2 -p 10022
#!author qmc #Author QMC usrname=input("Input your name:") age=input("age:") job=input("job:") info=''' __________Info of ''' + usrname + '''_________ Name:''' + usrname + ''' Age:''' + age + ''' Job:''' + job + ''' ''' print(info) info1=''' __________Info1 of %s_________ Name:%s Age:%s Job:%s ____________________________________ ''' % (usrname,usrname,age,job) print(info1) info2=''' __________Info2 of {_name}_________ Name:{_name} Age:{_age} Job:{_job} ____________________________________ '''.format( _name=usrname, _age=age, _job=job) print(info2) info3=''' __________Info3 of {0}_________ Name:{0} Age:{1} Job:{2} ____________________________________ '''.format(usrname,age,job) print(info3) #四种方法中不推荐使用info与info3这两种拼接方法,info方法使用+会每个变量产生单独的内存空间,效率低 #info3方法在变量多时容易产生混乱,不利于后期的优化。 ''' print(info3) 在python2.x中,有row_input和input,但推荐使用raw_input 使用input时,不加双引号,当成变量,加双”,则认为是赋值 在python3中只有input '''
变量和字符编码 使用pycharm的优点: 1.自动补全 2.可以调试 3.开发效率高 首先create project-->Location 3.x(选择3.x版本)-->new direcory-->new python file--> python默认模板配置viem--tool bar--file and code templetes--python script 在shell脚本中,首行使用#!/usr/bin/env python 使用#!/usr/bin/env python与#!/usr/local/python的区别: #!/usr/bin/env python是在环境变量中寻找最新版本的python解释器。 #!/usr/local/python是使用系统默认的python解释器。 变量是为了方便后面调用。变量存在在内存中。 变量定义的规则:变量名只能是字母、数字、下划线,变量名的第一个字符不能是数字,关键字不能声明为变量名。 变量名要是有一定的含义的。 name=’Alex Li’ print('my name is ',name) name2=name name='lisi' print(name,name2)#此时name的值是lisi,而name2的值还是Alex Li 此时name2的值就与name无关了,name2只是指向name指向的内存地址, 找到以后name2的值就与name无关了,name的值如何变化都不影响name2 在python3.x中就直接使用变量名name=,然后变量的值用单引号括起来赋值给变量。 调用时直接使用print("my name is ",name),print是打印多个值用逗号隔开。 字符编码: python解释器在加载.py文件中的代码时,会对内容进行编码(默认是ascii) ASCII(美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于 显示现代英语和其他西欧语言,最多只能用8位来表示。所有ASCII最多只能表示255个字符。 ASCII不支持中文。 1980年:支持简体中文的GB2312和繁体的big5 GB2312收录了7445个字符(包括6783个汉字和682个其他字符) 1995年:GBK1.0收录了21886个符号 2000年:GB18030取代GBK1.0,收录了27484个汉字(包括少数名族文字) 现在的PC平台必须支持GB18030 中文Windows的缺省内码还是GBK(gb18030相对GBK扩展的字符,一般人很少用) 国际标准组织新出了一个可以代表所有字符和符号的编码,即unicode unicode就是统一码、万国码、单一码,规定所有的字符和符号最少用16位来表示 UTF-8是对unicode编码的压缩和优化,他不再使用最少两个字节,而是将所有的字符和符号进行分类: ascii码中的内容用一个字节保存,欧洲的字符用2个字节来保存,东亚的字符用3个字符来保存 #_*_ coding:utf-8 _*_ #此是声明用utf-8来处理程序 pycharm常用快捷键: alt+ctrl+s 打开设置界面 tab 选择要缩进的代码,按键缩进 shift+tab 选择要缩进的代码,按键增加 ctrl+d 复制本行粘贴到下一行 ctrl+? 选择要添加注释的行,按键进行#添加或去除 双shift 全局搜索 ctrl+/ 查找 ctrl+R 查找替换
python的创始人是Guido van Rossum。 1989年的圣诞节期间,吉多-范罗苏姆为了打发时间, 决心写一个新的脚本解释程序,作为ABC语言的一种继承。 第一个发行版在1991年 python应用于很多的领域,如:数据分析、组件集成、网络服务、 图像处理、数值计算和科学计算等众多领域。 目前业内几乎所有的大中型企业都在使用python, 如Youtube、Dropbox、Quora(中国知乎)、豆瓣、知乎、Google、 Facebook、NASA、百度、腾讯、汽车之家、美团等。 目前主要应用领域: 云计算:云计算最火的语言,典型应用是openstack web开发:典型的web框架是Django,Twised(典型的异步网络框架) Python网络编程框架Twised,Twisted是以高性能为目标的异步(event-driven)网络编程框架。 科学运算、人工智能:典型库NumPy,SciPy 系统运维:运维人员必备语言 图像GUI:PYQT、WxPython Tkinter python在一些公司的应用: 谷歌: CIA:美国中情局网站是用python开发的。 NASA:美国航天局大量使用python进行数据分析和运算 YouTube:世界上最大的视频网站是用python开发的。 Dropbox:美国最大的在线云存储网站,全部用python实现,每天网站处理10亿个文件的上传和下载 Instagram:美国最大的图片分享社交网站,每天超过3千万张照片被分享,全部使用python开发。 Facebook:大量的基础库都是通过python实现的。 Redhat:世界上最流行的linux发行版中yum包管理工具就是用python开发的。 豆瓣:公司几乎所有的业务都是通过python开发的。 知乎:国内最大的问答社区,通过python开发的(国外的Quora)【知乎是完全copy国外的Quora,都用python开发】 编程语言主要从以下几个角度进行分类: 编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语言。 编译型语言就是一次性把所有的源代码都翻译成机器语言,然后写成可执行文件。 解释型语言就是用一行解释一行,解释型程序离不开解释程序。 编译型语言由于执行速度快,同等条件下对系统要求较低。 典型的编译语言有:C/C++ VB PascalObject PascalDelphi 动态类型语言:是在运行期间才去做数据类型检查的语言。 python和Ruby都是典型的动态类型语言。 静态类型语言:她的数据类型是在编译期间检查的,也就是说在写程序时要声明所有变量的类型。 强类型定义语言:指的是一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个类型了 若类型定义语言:可以忽略变量的数据类型,一个变量可以赋予不同的数据类型的值。 python是一门动态解释型强类型定义语言。 python的优缺点: 优点: 1.python的定位是“优雅、明确、简单”,程序看上去简单易懂 2.开发效率非常高,有非常强大的第三方库,可以在基础库的基础上进行开发,降低开发周期。 3.高级语言,用python写程序时,无需考虑如何管理你的程序使用的内存一类的底层细节。 4.可移植性:开源的本质,python程序无需修改就几乎可以在市场上的所有平台上运行。 5.可扩展性:如果某段代码不公开,可以用c/c++编写,然后用python来调用。 5.可嵌入性:可以把python嵌入到c/c++程序 缺点: 1.速度慢。运行速度比c语言慢很多,比JAVA也要慢一些。 2.代码不能加密。 3.多线程不能利用多CPU问题。 python的解释器: CPython:应用最广,这个解释器是用c语言开发的。 IPython:基于CPython的一个交互解释器。 PyPy:可以对python代码进行动态编译,可以显著提高python代码的执行速度。 python的发展: 1989年才开始开发,1991年第一个编译器诞生,用c语言实现,并能够调研c语言的库文件。 go语言是1999年诞生,docker就是用go语言开发的。 Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。 php是1994年诞生的。 python2.0在2000年加入了内存回收机制,构成了现在python语言框架的基础 python2.4,2004年:同一年Django诞生 python2.6 2008年:过渡版本,兼容2.4与3.0的特性。 python2.7 2010年:也是过渡版本,兼容2.4与3.0的特性。 python的所有的最新的完整的库更更新在python3.x上。 python3.x默认使用unicode编码,默认支持中文。
#Author QMC age = 56 count=0 while True: guess_age = int(input("guess age of age: ")) if guess_age == age: print ("yes , you got it") break elif guess_age > age: print ("think smaller....") else: print("think bigger ...") count = count + 1 if count>3: break