Поиск

Найдена 21 статья по слову "python"

Установка зависимостей Pipenv в Mac M1

Создаем файл для прокидывания своих переменных окружения:

sudo vim /usr/local/bin/pipenv_m1

Со следующим содержимым (у вас может отличаться путь openssl и python):

#!/bin/bash
CFLAGS="-I /opt/homebrew/opt/openssl/include" LDFLAGS="-L /opt/homebrew/opt/openssl/lib" GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1 /Library/Frameworks/Python.framework/Versions/3.9/bin/pipenv $@

Даем право на запуск:

sudo chmod +x /usr/local/bin/pipenv_m1

Потом настраиваем в PyCharm, идем в Preferences -> Tools -> Python Integrated Tools (или просто ищем в настройках по слову pipenv) и в разделе Pipenv ставим следующий путь:

/usr/local/bin/pipenv_m1

Нажимаем ОК и пробуем установить из PyCharm виртуальное окружение через Pipenv. Все должно работать.

macos python

Если поломался pip на macOS

Например, ругается на zlib, хотя он установлен:

      File "/usr/local/Cellar/python@3.7/3.7.9_2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/distutils/command/build_ext.py", line 340, in run
        self.build_extensions()
      File "/private/var/folders/3r/04yr8dd57896ccmx1f86ptnr0000gn/T/pip-install-lmm5ssql/Pillow/setup.py", line 694, in build_extensions
        raise RequiredDependencyException(f)
    __main__.RequiredDependencyException: zlib

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/3r/04yr8dd57896ccmx1f86ptnr0000gn/T/pip-install-lmm5ssql/Pillow/setup.py", line 918, in <module>
        raise RequiredDependencyException(msg)
    __main__.RequiredDependencyException:

    The headers or library files could not be found for zlib,
    a required dependency when compiling Pillow from source.

    Please see the install instructions at:
       https://pillow.readthedocs.io/en/latest/installation.html

То можно сделать следующее:

python3 -m pip install --user --force-reinstall pip

После этого у меня все установилось. Если не поможет - то можно понизить версию python через brew и не забывайте про brew doctor.

python

Как подружить Django и React

Подготовка

<span>1.</span> Создание нового проекта Django

$ django-admin startproject app
$ cd app
$ virtualenv -p python3.6 venv
$ source venv/bin/activate
$ pip install django
$ python manage.py migrate

<span>2.</span> Создание React-приложения

$ mkdir frontend
$ cd frontend
$ npm init -y

Дружим

<span>3.</span> Измените содержимое ключа scripts в файле frontend/package.json

"scripts": {
  "build": "webpack --config webpack.config.js --progress --colors",
  "watch": "webpack --config webpack.config.js --watch --mode development"
},

<span>4.</span> Установите необходимые библиотеки

$ npm install --save-dev babel-core babel-loader babel-preset-env babel-preset-react webpack webpack-bundle-tracker webpack-cli clean-webpack-plugin @babel/core @babel/preset-env @babel/preset-react
$ npm install --save react react-dom

<span>5.</span> Создайте файл frontend/webpack.config.js

var path = require("path");
var webpack = require('webpack');
var BundleTracker = require('webpack-bundle-tracker');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
  context: __dirname,

  entry: './src/index',

  output: {
      path: path.resolve('./build/'),
      filename: "[name]-[hash].js",
  },

  plugins: [
    new CleanWebpackPlugin(),
    new BundleTracker({filename: './webpack-stats.json'}),
  ],
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: ['babel-loader']
      }
    ]
  },
  resolve: {
    extensions: ['*', '.js', '.jsx']
  }
};

<span>6.</span> Создайте файл frontend/.babelrc со следующим содержимым

{
    "presets": ["@babel/preset-env", "@babel/react"]
}

<span>7.</span> Создайте индексный файл для реакта frontend/src/index.js

import React from 'react'
import ReactDOM from 'react-dom'


function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

const element = <Welcome name="world" />;
ReactDOM.render(
  element,
  document.getElementById('react')
);

<span>8.</span> Установить модуль django-webpack-loader в Django

pip install django-webpack-loader

<span>9.</span> Добавить его в INSTALLED_APPS и настроить

INSTALLED_APPS = (
    # ...
    'webpack_loader',
)

WEBPACK_LOADER = {
    'DEFAULT': {
        'BUNDLE_DIR_NAME': 'build/',  # это префикс для урла - /media/build/
        'STATS_FILE': os.path.join(BASE_DIR, 'frontend', 'webpack-stats.json'),  # путь до файла webpack-stats.json
    }
}

<span>10.</span> Создать индексный файл в темплейтах Django

{% load render_bundle from webpack_loader %}

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Example</title>
    </head>
    <body>
        <div id="react"></div>
        {% render_bundle 'main' %}
    </body>
</html>

Разработка

Запустить React

cd frontend && npm run watch

И запустить Django

source venv/bin/activate && python manage.py runserver

Внести изменения, сохранить файлы в реакте, перейти на необходимую страницу и перезагрузить (хот-релоада нет).

<hr />

Источник, переведенный и дополненный (исправлены ошибки): https://medium.com/uva-mobile-devhub/set-up-react-in-your-django-project-with-webpack-4fe1f8455396

django react

Глобально меняем ключи доступа и пароли от всех своих серверов с помощью Ansible

Если вам необходимо обновить ключи доступа и пароли на многих серверах (например, ушел какой-либо сотрудник у которого был доступ к каким-то серверам, либо просто в целях безопасности обновить надо, либо для CI, вариантов куча), то можно использовать для этого Ansible.

Создайте директорию public_keys/, где будете хранить ваш ключ и ключи ваших сотрудников. Добавьте туда все необходимые ключи, например:

Файл public_keys/crusat:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDVk9yuKpN/c1+TsM3i0YW5H1Z86dVZQvAkOAxF3VZMIS48Ng6JjTOx58/kf5Z1fjNVcxNWv0uyrARstgZTokWiNfeHGYyMR+htivsJnFHiG6i1OXUdRAfNh84EXPm0LZbvzcRm9MM36nsa5cNS4dGE8ZxObW29O....

Со всеми остальными проделайте то же самое.

Теперь создадим плейбук set_access.yml (обратите внимание на обращение к ключам из public_keys - эти ключи будут добавлены, адаптируйте под себя):

---
- hosts: all 
  remote_user: root
  vars_files: ['credentials.yml']
  tasks:
  - name: Set main authorized key and remove existent
    authorized_key:
      user: root
      state: present
      key: '{{ item }}'
      exclusive: True
    with_file:
      - ./public_keys/crusat
  - name: Set up other keys
    authorized_key:
      user: root
      state: present
      key: '{{ item }}'
    with_file:
      - ./public_keys/user1
      - ./public_keys/user2
  - name: Set root password
    user:
      name: root
      state: present
      update_password: always
      password: "{{ admin_default_password }}"
      shell: /bin/bash

Теперь надо сделать возможность задания входа по паролю (см. последнюю задачу в ansible - можно задавать для разных пользователей, просто скопируйте, сколько необходимо).

Для этого создадим файл set_access.sh:

#!/bin/bash

NEW_PASSWORD='mysuperpassword'

HASHED_PASSWORD=`python3 -c 'import crypt; print(crypt.crypt("'"$NEW_PASSWORD"'", crypt.mksalt(crypt.METHOD_SHA512)))'`

echo 'admin_default_password: '$HASHED_PASSWORD > ./credentials.yml

ansible-playbook -i inventory_hosts -l test ./set_access.yml

Здесь укажите правильный путь к инвентарю. Суть в следующем - скрипт берет пароль, хэширует его, помещает в файл credentials.yml и затем выполняет плейбук, который как раз возьмет хэшированный пароль как переменную и задаст необходимый пароль для пользователя root.

ansible bash copypaste devops

Как проще всего развернуть Django-проект через Docker

Приведу здесь пошаговое руководство. Как устанавливать и использовать сам фреймворк здесь не описано, так что, при необходимости, обратитесь к официальной документации .

Структура проекта

<span>1.</span> Начнем с приложения. Создадим директорию, в которой будет проект (здесь я создаю его в домашней директории, может находиться где угодно):

$ mkdir ~/my_app

В корне будут храниться файлы конфигураций, так что приложение сгенерирем в поддиректории.

<span>2.</span> Сгенерируем в этой директории Django-приложение:

$ django-admin startproject app

<span>3.</span> Базово настроим Django-проект:

$ cd ~/my_app/
$ virtualenv -p python3.6 venv
$ source venv/bin/activate
$ pip install django
$ pip install python-dotenv
$ pip install psycopg2-binary
$ pip install gunicorn
$ pip freeze > ./app/requirements.txt

Объясню решение по поводу venv. Рекомендую сделать виртуальное окружение на уровень выше приложения, чтобы он не мешал при сборке докер-образа в будущем (чтобы не отправлялся контекст в докер при сборке и образ собирался быстрее).

Из requirements.txt удалите строку pkg-resources==0.0.0 (такой версии не существует и она сломает установщик).

В my_app/app/app/settings.py надо переменные для БД брать из файла .env (см. документацию к python-dotenv):

import os
from dotenv import load_dotenv

load_dotenv()

SECRET_KEY = os.getenv("SECRET_KEY")
DEBUG = bool(os.getenv("DEBUG"))

# ...

ALLOWED_HOSTS = ['*']

# ...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.getenv('POSTGRES_DB'),
        'USER': os.getenv('POSTGRES_USER'),
        'PASSWORD': os.getenv('POSTGRES_PASSWORD'),
        'HOST': os.getenv('POSTGRES_HOST'),
        'PORT': os.getenv('POSTGRES_PORT'),
    },
}

# ...

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    # os.path.join(BASE_DIR, '..', "frontend", "src"),
)
STATIC_ROOT = os.path.join(BASE_DIR, '..', 'public', 'static')

MEDIA_ROOT = os.path.join(BASE_DIR, '..', 'public', 'media')
MEDIA_URL = '/media/'

# ...

<span>4.</span> Создаем файл .env в корне (~/my_app/.env), пример содержимого:

SECRET_KEY=1234567890

DEBUG=1

POSTGRES_DB=db
POSTGRES_USER=user
POSTGRES_PASSWORD=password
POSTGRES_HOST=localhost
POSTGRES_PORT=5432

<span>5.</span> Теперь создадим docker-compose конфигурацию, которая поможет нам при разработке. Положим файл в корень проекта:

Файл docker-compose.yml:

version: '3' 

services:
  db: 
    image: postgres:11-alpine
    env_file:
      - .env
    volumes:
      - ./postgresql/dumps:/code/dumps
      - ./postgresql/data:/var/lib/postgresql/data
    restart: always
    ports:
      - "${POSTGRES_PORT}:5432"

В данном файле можно обратить внимание на env_file - это откуда будут применены переменные окружения (логин, пароль, имя базы данных при первом создании).

Также, если вы не хотите, чтобы при рестарте компьютера контейнер с базой данных автоматически запускался, то удалите строчку restart: always

И последнее - все хранилища будут находиться в директории проекта.

<span>6.</span> Протестируем, что все нормально работает для разработки:

$ cd ~/my_app
$ docker-compose up -d
$ source venv/bin/activate
$ python app/manage.py migrate

<span>7.</span> Инициализируем в корне приложения git-репозиторий и настроем удаленный репозиторий (наконец-то бесплатные приватные репозитории на github), например:

$ cd ~/my_app/
$ git init
$ git remote add origin https://github.com/crusat/test.git

И не забудьте сделать файл .gitignore, например:

*.pyc
*.log
__pycache__
/app/venv/
db.sqlite3
.DS_Store
/public/*
!/public/favicon.ico
/.idea/
.vscode/
*.history
/reports/
.coverage
*.swp
/htmlcov/
*.ipynb
.env
nohup.out
/postgresql/
tmp

И запушить:

$ git add .
$ git commit -am "initial"
$ git push -u origin master

Подготовка к деплою

<span>8.</span> Регистрируем на докер хабе (можно использовать gitlab registry и т.п.) новый репозиторий https://cloud.docker.com/repository/create - в него мы будем пушить образы. В будущем для этого можно сделать автоматическую сборку, но пока делаем в ручном режиме, для понимания. Назовем репозиторий, например, “test”.

<span>9.</span> Теперь надо сбилдить образ, который мы будем деплоить. Для этого в директории ~/my_app/app/ создадим файл Dockerfile:

FROM python:3.6-stretch

ENV PYTHONUNBUFFERED 1

# Здесь можно добавлять пакеты, которые необходимы для работы приложения
RUN apt update && apt install -y python3-dev

WORKDIR /code

# Сначала копируем requirements.txt, для того, чтобы образ собирался быстрее (см. слои докера)
COPY requirements.txt /code/
RUN pip install -r requirements.txt

# Далее копируем сам код приложения
COPY . /code/
WORKDIR /code/

EXPOSE 8000

И файл run.sh там же с содержимым:

#!/usr/bin/env sh

python ./manage.py migrate
python ./manage.py collectstatic --noinput
gunicorn --forwarded-allow-ips=* --bind 0.0.0.0:8080 -w 2 app.wsgi:application

Запускаем билд, потом авторизуемся на удаленном сервере, затем пушим в удаленный репозиторий докерхаба.

$ docker build -t crusat/test .
$ docker login
$ docker push crusat/test

Замените “crusat/test” на ваше имя пользователя и имя репозитория.

<span>10.</span> Теперь подготовим docker-compose.yml для удаленного сервера.

Создаем директорию ~/my_app/deploy

Создаем файл ~/my_app/deploy/docker-compose.yml с содержимым:

version: '3'

services:

  server:
    image: nginx:alpine
    restart: always
    depends_on:
      - web
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./public:/code/public

  web:
    image: crusat/test:latest
    command: sh -c "/code/run.sh"
    restart: always
    env_file:
      - .env
    depends_on:
      - db
    volumes:
      - ./public:/code/public

  db:
    image: postgres:10-alpine
    restart: always
    env_file:
    - .env
    volumes:
    - ./postgres/data:/var/lib/postgresql/data
    - ./postgres/dumps:/dumps

Замените в этом файле “crusat/test” на ваши данные.

Также, создайте в этой директории файл .env аналогичным тому, который лежит в корне.

И положите файл nginx.conf там же со следующим содержимым:

# daemon off;
worker_processes  auto;

pid  /var/run/nginx.pid;

events {
    worker_connections  1024;
    multi_accept on;
    use epoll;
}

http {
    default_type application/octet-stream;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    types_hash_max_size 2048;
    client_max_body_size 1G;

    include /etc/nginx/mime.types;

    server {
        listen 80;
        server_name _;

        # gzip begin
        gzip on;
        gzip_disable "msie6";

        gzip_vary on;
        gzip_proxied any;
        gzip_comp_level 6;
        gzip_buffers 16 8k;
        gzip_http_version 1.1;
        gzip_min_length 256;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
        # gzip end

        location /media/ {
            root /code/public;
            expires max;
            try_files $uri$args $uri =404;
        }

        location /static/ {
            root /code/public;
            expires max;
            try_files $uri$args $uri =404;
        }

        location = /favicon.ico {
            alias /code/public/favicon.ico;
        }

        location / {
            proxy_pass http://web:8000;
            proxy_set_header Host $http_host;
            proxy_set_header Connection "upgrade";
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Upgrade $http_upgrade;
            proxy_connect_timeout       600;
            proxy_send_timeout          600;
            proxy_read_timeout          600;
            send_timeout                600;
        }
    }
}

Удаленная машина

<span>1.</span> Для начала надо зарегистрировать новый сервер. Я использую хостинг https://vscale.io и Ubuntu (в данный момент последняя LTS это 18.04). При создании добавьте свой публичный ключ. Возможно, сервера на 512 мб ОЗУ не будет достаточно и придется использовать сервер на 1 гб ОЗУ.

<span>2.</span> Заходим на сервер, например:

$ ssh root@123.123.123.123

<span>3.</span> Устанавливаем зависимости:

$ apt update && apt install -y curl

<span>4.</span> Устанавливаем Docker и docker-compose:

$ curl -sSL https://get.docker.com/ | sh; curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose

<span>5.</span> Создаем нового пользователя (назовем его deploy) и добавляем его к группе Docker, чтобы не требовался root-доступ для работы с докером:

$ adduser deploy
$ usermod -aG docker deploy

<span>6.</span> Проверяем, что все работает нормально:

$ su deploy
$ docker run hello-world

Должно появиться следующее (если вывелось это, то все работает нормально):

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

<span>7.</span> Теперь копируем содержимое директории deploy (~/my_app/deploy) в директорию на сервере (/home/deploy/my_app) и устанавливаем владельца, также поменяйте пароли и секретные ключи в файле окружения .env.

$ chown -R deploy:deploy /home/deploy/my_app

Пример содержимого .env:

SECRET_KEY=MubREzkP5GNMxBCHE3wOhuo49zpEjZMUEhoAjkvVujEl3AUD

DEBUG=

POSTGRES_DB=db
POSTGRES_USER=user
POSTGRES_PASSWORD=snm2LfPnas1Fb7d8
POSTGRES_HOST=db
POSTGRES_PORT=5432

<span>8.</span> Теперь необходимо авторизоваться на реджистри, забрать последний образ и развернуть приложение:

$ su deploy
$ docker login
$ cd /home/deploy/my_app
$ docker-compose pull && docker-compose down && docker-compose up -d

<span>9.</span> Заходим по IP-адресу сервера, все должно работать. При необходимости подключаем домен (ставим А-запись домена на регистраторе на IP-адрес сервера).

bash devops django docker linux nginx postgresql python

Простейший работающий пример docker + chromedriver + selenium + python на сервере

Скачать пример файлом - example_chromedriver.zip

Структура папок и файлов:

wrapper/Dockerfile
wrapper/requirements.txt
wrapper/main.py
docker-compose-yml

Содержимое docker-compose.yml:

version: "2"

services:

  web:
    build: wrapper
    restart: always
    command: python main.py

Содержимое wrapper/Dockerfile:

FROM python:3.6

ENV PYTHONUNBUFFERED 1

# install google chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable

# install chromedriver
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/

# set display port to avoid crash
ENV DISPLAY=:99

RUN mkdir /code
WORKDIR /code

COPY . /code/

RUN pip install -r requirements.txt

Содержимое wrapper/requirements.txt:

selenium==3.8.0

Содержимое wrapper/main.py:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time


chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.implicitly_wait(10)

while True:
    print('start')
    driver.get("http://www.python.org")
    assert "Python" in driver.title
    elem = driver.find_element_by_name("q")
    print('elem', elem)
    elem.clear()
    elem.send_keys("pycon")
    elem.send_keys(Keys.RETURN)
    assert "No results found." not in driver.page_source
    print('all ok')
    time.sleep(3)

driver.close()

Источник: https://github.com/joyzoursky/docker-python-chromedriver

python selenium

Как установить модули python без интернета с помощью pip

Для начала надо скачать все модули, которые перечислены в requirements.txt. Проще всего через докер.

$ docker run -it --rm --name my -v "$PWD":/tmp/pip_cache python:3.6 pip download -r /tmp/pip_cache/requirements.txt -d /tmp/pip_cache/

Обратите внимание на версию. Тут используется 3.6 - она должна совпадать с той версией питона, который установлен на сервере. Иначе Pillow, psycopg2 и т.п. скомпилированные модули не поставятся.

Затем можно залить их и установить с помощью такой команды:

$ pip install -r requirements.txt -f /path/to/pip/cache/ --no-index

Все, после этого можно использовать.

copypaste python

Удаление дубликатов в модели Django

Например, у нас есть модель такого вида:

class Email(models.Model):
    email = models.CharField(max_length=50)

И мы хотим удалить дубликаты объектов этой модели. Для этого делаем следующее.

Выбираем список значений поля email без повторов и перебираем его.
Далее перебираем все элементы, у которых количество одинаковых email больше одного и удаляем лишнее. При необходимости можно добавить сортировку.

for email in Email.objects.values_list('email', flat=True).distinct():
    Email.objects.filter(pk__in=Email.objects.filter(email=email).values_list('id', flat=True)[1:]).delete()

Обратите внимание, что если значения будут пустыми строками или null, то они будут также обработаны и удалены, кроме одного.
Для того, чтобы это избежать, можно сделать следующее:

for email in Email.objects.values_list('email', flat=True).distinct():
    Email.objects.exclude(email__isnull=True).exclude(email__exact='').filter(pk__in=Email.objects.filter(email=email).values_list('id', flat=True)[1:]).delete()

Приведенные выше действия можно производить где угодно, но обычно это делает однажды в django shell:

./manage.py shell

Источник: http://stackoverflow.com/questions/5877306/remove-duplicates-in-a-django-query

django

Количество запущенных процессов bash

Список запущенных процессов (например, python)

pidof python

Количество запущенных процессов для python/perl/bash и прочих с параметрами (например, python3 acd_cli …). Пример ниже выведет 0, 1 или больше

pidof -x someapp | wc -w
bash copypaste

Поиск недостающего числа в массиве

Дан массив из N чисел. В нём находятся случайные числа из диапазона [0..N]. Все числа отличаются. При помощи одного цикла нужно найти, какого числа из диапазона [0..N] не хватает в массиве.

Логика следующая:

Мы должны получить два числа - сумму всех чисел, которые должны быть в массиве, и сумму чисел, которые есть в массиве. Затем, просто вычитаем из первой сумму вторую и получаем число, которого нет.

Код на Python:

В данном коде сделан генератор массива (condition) и решение (solution).

#!/usr/bin/python

# condition
import random
N = 10
source_array = list(range(0, N+1))
random.shuffle(source_array)
source_array.pop()
print source_array

# solution
current_sum = 0
full_sum = 0
inc_value = 1
for x in source_array:
    current_sum += x
    full_sum += inc_value
    inc_value += 1
found_value = full_sum - current_sum
print "Found value " + str(found_value)
python алгоритмы